Please open Telegram to view this post
VIEW IN TELEGRAM
Поддержка функционального программирования в Java
Начиная с Java 8, язык получил мощные инструменты для поддержки функционального программирования:
Лямбда-выражения: Позволяют писать анонимные функции в компактной форме.
Функциональные интерфейсы: Интерфейсы с одним абстрактным методом (SAM), которые могут быть реализованы с помощью лямбда-выражений.
Stream API: Позволяет работать с коллекциями в функциональном стиле.
Лямбда-выражения
Лямбда-выражения — это краткий способ написания анонимных функций.
Они состоят из:
Списка параметров.
Стрелки (->).
Тела функции.
Синтаксис:
Примеры:
Простое лямбда-выражение:
Лямбда с параметрами:
Лямбда с несколькими строками:
Преимущества лямбда-выражений
Упрощение кода.
Улучшение читаемости.
Поддержка функционального стиля программирования.
Недостатки лямбда-выражений
Могут быть сложны для понимания новичкам.
Отладка лямбда-выражений может быть менее удобной.
Функциональные интерфейсы
Функциональные интерфейсы — это интерфейсы, которые содержат ровно один абстрактный метод (Single Abstract Method, SAM). Они используются для представления лямбда-выражений и ссылок на методы.
Примеры функциональных интерфейсов в Java:
Predicate<T>: Принимает один аргумент и возвращает boolean.
Function<T, R>: Принимает один аргумент и возвращает результат.
Consumer<T>: Принимает один аргумент и не возвращает результат.
Supplier<T>: Не принимает аргументов, но возвращает результат.
Пример использования:
#Java #Training #Medium #Functional_programming #Stream_API #Lambda_expressions #Functional_interfaces
Начиная с Java 8, язык получил мощные инструменты для поддержки функционального программирования:
Лямбда-выражения: Позволяют писать анонимные функции в компактной форме.
Функциональные интерфейсы: Интерфейсы с одним абстрактным методом (SAM), которые могут быть реализованы с помощью лямбда-выражений.
Stream API: Позволяет работать с коллекциями в функциональном стиле.
Лямбда-выражения
Лямбда-выражения — это краткий способ написания анонимных функций.
Они состоят из:
Списка параметров.
Стрелки (->).
Тела функции.
Синтаксис:
(параметры) -> { тело функции }
Примеры:
Простое лямбда-выражение:
// Без лямбды
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("Hello, World!");
}
};
// С лямбдой
Runnable runnable = () -> System.out.println("Hello, World!");
Лямбда с параметрами:
// Без лямбды
Comparator<Integer> comparator = new Comparator<Integer>() {
@Override
public int compare(Integer a, Integer b) {
return a.compareTo(b);
}
};
// С лямбдой
Comparator<Integer> comparator = (a, b) -> a.compareTo(b);
Лямбда с несколькими строками:
// Без лямбды
Function<String, Integer> lengthFunction = new Function<String, Integer>() {
@Override
public Integer apply(String s) {
return s.length();
}
};
// С лямбдой
Function<String, Integer> lengthFunction = s -> {
System.out.println("Calculating length of: " + s);
return s.length();
};
Преимущества лямбда-выражений
Упрощение кода.
Улучшение читаемости.
Поддержка функционального стиля программирования.
Недостатки лямбда-выражений
Могут быть сложны для понимания новичкам.
Отладка лямбда-выражений может быть менее удобной.
Функциональные интерфейсы
Функциональные интерфейсы — это интерфейсы, которые содержат ровно один абстрактный метод (Single Abstract Method, SAM). Они используются для представления лямбда-выражений и ссылок на методы.
Примеры функциональных интерфейсов в Java:
Predicate<T>: Принимает один аргумент и возвращает boolean.
Function<T, R>: Принимает один аргумент и возвращает результат.
Consumer<T>: Принимает один аргумент и не возвращает результат.
Supplier<T>: Не принимает аргументов, но возвращает результат.
Пример использования:
// Predicate
Predicate<Integer> isEven = n -> n % 2 == 0;
System.out.println(isEven.test(4)); // true
// Function
Function<String, Integer> lengthFunction = String::length;
System.out.println(lengthFunction.apply("Hello")); // 5
// Consumer
Consumer<String> printConsumer = System.out::println;
printConsumer.accept("Hello, World!");
// Supplier
Supplier<Double> randomSupplier = Math::random;
System.out.println(randomSupplier.get()); // Случайное число
#Java #Training #Medium #Functional_programming #Stream_API #Lambda_expressions #Functional_interfaces
Stream API
Stream API — это мощный инструмент для работы с коллекциями в функциональном стиле. Он позволяет выполнять операции над данными, такие как фильтрация, преобразование, сортировка и агрегация, без изменения исходных данных.
Основные операции Stream API:
Промежуточные операции (intermediate): Возвращают новый поток и могут быть объединены в цепочку.
filter(Predicate<T>): Фильтрует элементы.
map(Function<T, R>): Преобразует элементы.
sorted(): Сортирует элементы.
Терминальные операции (terminal): Завершают поток и возвращают результат.
forEach(Consumer<T>): Выполняет действие для каждого элемента.
collect(Collector<T, A, R>): Собирает элементы в коллекцию.
reduce(BinaryOperator<T>): Сворачивает элементы в одно значение.
Пример использования:
Преимущества Stream API
Упрощение работы с коллекциями.
Поддержка параллельного выполнения (через parallelStream()).
Читаемость и выразительность кода.
Недостатки Stream API
Может быть менее производительным для простых операций из-за накладных расходов.
Сложность отладки из-за цепочек вызовов.
#Java #Training #Medium #Functional_programming #Stream_API #Lambda_expressions #Functional_interfaces
Stream API — это мощный инструмент для работы с коллекциями в функциональном стиле. Он позволяет выполнять операции над данными, такие как фильтрация, преобразование, сортировка и агрегация, без изменения исходных данных.
Основные операции Stream API:
Промежуточные операции (intermediate): Возвращают новый поток и могут быть объединены в цепочку.
filter(Predicate<T>): Фильтрует элементы.
map(Function<T, R>): Преобразует элементы.
sorted(): Сортирует элементы.
Терминальные операции (terminal): Завершают поток и возвращают результат.
forEach(Consumer<T>): Выполняет действие для каждого элемента.
collect(Collector<T, A, R>): Собирает элементы в коллекцию.
reduce(BinaryOperator<T>): Сворачивает элементы в одно значение.
Пример использования:
List<String> languages = List.of("Java", "Kotlin", "Scala", "Groovy");
// Фильтрация и преобразование
List<String> filteredLanguages = languages.stream()
.filter(lang -> lang.startsWith("J")) // Фильтруем по условию
.map(String::toUpperCase) // Преобразуем в верхний регистр
.collect(Collectors.toList()); // Собираем в список
System.out.println(filteredLanguages); // [JAVA]
// Агрегация
int totalLength = languages.stream()
.mapToInt(String::length) // Преобразуем в длины строк
.sum(); // Суммируем длины
System.out.println(totalLength); // 18
Преимущества Stream API
Упрощение работы с коллекциями.
Поддержка параллельного выполнения (через parallelStream()).
Читаемость и выразительность кода.
Недостатки Stream API
Может быть менее производительным для простых операций из-за накладных расходов.
Сложность отладки из-за цепочек вызовов.
#Java #Training #Medium #Functional_programming #Stream_API #Lambda_expressions #Functional_interfaces
Всем субботний привет! 😂
Как ваши дела и настроение?🙃
Готовлю на завтра, по просьбам трудящихся (или учащихся), интеграцию проектов на Spring с внешними API.
Рассмотрим такие популярные способы, как RestTemplate, Feign, WebClient, Apache HttpClient и OkHttp.
Возможно даже что-то напишем😜
Жду всех!⭐️
Как ваши дела и настроение?
Готовлю на завтра, по просьбам трудящихся (или учащихся), интеграцию проектов на Spring с внешними API.
Рассмотрим такие популярные способы, как RestTemplate, Feign, WebClient, Apache HttpClient и OkHttp.
Возможно даже что-то напишем
Жду всех!
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Всем привет!
Совсем забыл напомнить, что сегодня в 16:00 по МСК, жду Вас на встречу🤦♂️ 🤪
Сегодня рассмотрим интеграцию приложений Spring и не только с внешними API.
Приходите, ссылку скину сюда же💪
Совсем забыл напомнить, что сегодня в 16:00 по МСК, жду Вас на встречу
Сегодня рассмотрим интеграцию приложений Spring и не только с внешними API.
Приходите, ссылку скину сюда же
Please open Telegram to view this post
VIEW IN TELEGRAM
Разбираем интеграцию приложения с внешними API. Немного про WebFlux. Встреча от 26.01.2025
Запись нашей встречи -
YOUTUBE
RUTUBE
На сегодняшней встрече мы разобрали на примере работу библиотек которые помогают связать наше приложение с внешними API:
— Рассмотрели такие популярные способы, как RestTemplate, Feign, WebClient и Apache HttpClient.
— Посмотрели как можно направить запрос и получить ответ из внешних сервисов.
— Коснулись верхами реактивного программирования, разобрали логику что такое реактивный запрос через WebFlux.
— Немного поговорили о взаимодействии приложений через API.
Смотрите, комментируйте, задавайте вопросы! Обязательно подписывайтесь на ютуб и рутюб каналы!!!
Всем хорошего настроения!🤘 🔫
Запись нашей встречи -
YOUTUBE
RUTUBE
На сегодняшней встрече мы разобрали на примере работу библиотек которые помогают связать наше приложение с внешними API:
— Рассмотрели такие популярные способы, как RestTemplate, Feign, WebClient и Apache HttpClient.
— Посмотрели как можно направить запрос и получить ответ из внешних сервисов.
— Коснулись верхами реактивного программирования, разобрали логику что такое реактивный запрос через WebFlux.
— Немного поговорили о взаимодействии приложений через API.
Смотрите, комментируйте, задавайте вопросы! Обязательно подписывайтесь на ютуб и рутюб каналы!!!
Всем хорошего настроения!
Please open Telegram to view this post
VIEW IN TELEGRAM
Функциональные интерфейсы.
Функциональный интерфейс — это интерфейс, который содержит только один абстрактный метод. Такой интерфейс может содержать множество default и static методов, но абстрактный метод должен быть только один. Функциональные интерфейсы используются для создания лямбда-выражений и ссылок на методы.
Функциональные интерфейсы позволяют писать более компактный и выразительный код, особенно при работе с лямбда-выражениями. Они являются основой для функционального программирования в Java.
Аннотация @FunctionalInterface
Java предоставляет аннотацию @FunctionalInterface, которая указывает, что интерфейс является функциональным. Эта аннотация не обязательна, но она помогает компилятору проверять, что интерфейс действительно содержит только один абстрактный метод. Если добавить второй абстрактный метод, компилятор выдаст ошибку.
Пример:
Встроенные функциональные интерфейсы
Java предоставляет несколько встроенных функциональных интерфейсов в пакете java.util.function. Основные из них:
Predicate — принимает один аргумент и возвращает boolean.
Consumer — принимает один аргумент и не возвращает ничего.
Supplier — не принимает аргументов, но возвращает значение.
Function — принимает один аргумент и возвращает результат.
Эти интерфейсы покрывают большинство сценариев использования лямбда-выражений.
Плюсы и минусы функциональных интерфейсов
Плюсы:
Упрощают код, делая его более читаемым.
Позволяют использовать лямбда-выражения и ссылки на методы.
Поддерживают функциональное программирование.
Минусы:
Могут быть сложны для понимания новичками.
Чрезмерное использование может привести к снижению читаемости кода.
Нюансы использования
Функциональные интерфейсы могут содержать default и static методы, что делает их более гибкими.
Лямбда-выражения могут быть использованы только с функциональными интерфейсами.
Аннотация @FunctionalInterface помогает избежать ошибок при добавлении лишних методов.
#Java #Training #Medium #Functional_programming #FunctionalInterface
Функциональный интерфейс — это интерфейс, который содержит только один абстрактный метод. Такой интерфейс может содержать множество default и static методов, но абстрактный метод должен быть только один. Функциональные интерфейсы используются для создания лямбда-выражений и ссылок на методы.
Функциональные интерфейсы позволяют писать более компактный и выразительный код, особенно при работе с лямбда-выражениями. Они являются основой для функционального программирования в Java.
Аннотация @FunctionalInterface
Java предоставляет аннотацию @FunctionalInterface, которая указывает, что интерфейс является функциональным. Эта аннотация не обязательна, но она помогает компилятору проверять, что интерфейс действительно содержит только один абстрактный метод. Если добавить второй абстрактный метод, компилятор выдаст ошибку.
Пример:
@FunctionalInterface
interface MyFunctionalInterface {
void execute(); // единственный абстрактный метод
default void print(String text) {
System.out.println(text);
}
}
Встроенные функциональные интерфейсы
Java предоставляет несколько встроенных функциональных интерфейсов в пакете java.util.function. Основные из них:
Predicate — принимает один аргумент и возвращает boolean.
Consumer — принимает один аргумент и не возвращает ничего.
Supplier — не принимает аргументов, но возвращает значение.
Function — принимает один аргумент и возвращает результат.
Эти интерфейсы покрывают большинство сценариев использования лямбда-выражений.
Плюсы и минусы функциональных интерфейсов
Плюсы:
Упрощают код, делая его более читаемым.
Позволяют использовать лямбда-выражения и ссылки на методы.
Поддерживают функциональное программирование.
Минусы:
Могут быть сложны для понимания новичками.
Чрезмерное использование может привести к снижению читаемости кода.
Нюансы использования
Функциональные интерфейсы могут содержать default и static методы, что делает их более гибкими.
Лямбда-выражения могут быть использованы только с функциональными интерфейсами.
Аннотация @FunctionalInterface помогает избежать ошибок при добавлении лишних методов.
#Java #Training #Medium #Functional_programming #FunctionalInterface
Что выведет код?
#Tasks
public class Task270125 {
public static void main(String[] args) {
int a = 10_000;
long b = 10_000L;
double c = 10_000D;
float d = 10_000F;
System.out.println(a + b + c + d);
}
}
#Tasks
Варианты ответа:
Anonymous Quiz
7%
40000
45%
40000.0
45%
Ошибка компиляции
2%
100001000010000.010000.0
Оглавление часть 4. Spring продолжение
——SPRING CACHE——
Введение в кеширование в Spring
Аннотации @Cacheable и @CacheEvict
Виды кеша в Spring и настройки конфигурации для Redis, Ehcache и Caffeine
Примеры использования кеша на примере Caffeine и Redis
——SPRING AOP——
Основы аспектно-ориентированного программирования (AOP) в Spring
Зачем нужно AOP?
Понятия Joinpoint, Pointcut, Advice
Создание простого аспекта
Аннотации @Before, @After, @Around
Примеры аспектов
Pointcut Expressions
Настройка AOP через XML и аннотации
Практическое использование AOP для логирования
Проверка авторизации для выполнения методов
Транзакционный менеджмент с помощью AOP
Все аннотации AOP и их использование
——SPRING SECURITY——
Введение в Spring Security
Основные принципы безопасности
Spring Security и его интеграция в проект
Аннотации используемые в Spring Security
Аутентификация и Авторизация в Spring Security
Проверка подлинности пользователя в Spring Security
OAuth2 Authentication
Использование базы данных для хранения пользователей в Spring Security
Настройка ролей и прав доступа в Spring Security
JWT (JSON Web Token)
Внедрение JWT-аутентификации в Spring Security
Обработка исключений в Spring Security
Настройка кастомных страниц ошибок в Spring Security
——REST——
REST и его архитектура
Принципы построения RESTful API
Форматы данных: JSON и XML
Настройка сериализации данных в Spring
Работа с HTTP-методами в Spring: GET, POST, PUT, DELETE
Создание CRUD API в Spring
Пагинация и фильтрация данных в REST API с использованием Spring
Обработка ошибок в REST API с использованием Spring Boot
Микросервисы в контексте Spring
Компоненты микросервисной архитектуры
——SPRING TEST——
Введение в тестирование в Spring
Аннотации JUnit 5
Продвинутые аннотации JUnit 5
Введение в Mockito
Проверка вызовов методов с помощью verify в Mockito
Аргумент-матчеры и частичное мокирование
Всё о thenReturn, thenThrow и thenAnswer в Mockito
Тестирование Spring компонентов
Интеграционные тесты с использованием базы данных
Тестирование веб-приложений в Spring
Написание тестов для CRUD REST API
Основы тестирования взаимодействия с базами данных в Spring
Нюансы и продвинутые сценарии тестирования с PostgreSQL
Тестирование сложных сценариев в Spring
Лучшие практики, советы и нюансы тестирования в Spring
——LOMBOK——
Введение в Lombok и базовые аннотации
Lombok, базовые аннотации
Аннотации для конструкторов
Аннотации для управления состоянием
Аннотации для логирования
Аннотации для работы с исключениями
Аннотации для работы с синхронизацией
Аннотации для работы с данными — @Value и @With
Создание кастомных аннотаций с использованием Lombok
Аннотации Lombok для работы с ресурсами, делегированием и утилитарными классами
Продвинутые аннотации Lombok и лучшие практики
Лучшие практики использования Lombok
#Contents
——SPRING CACHE——
Введение в кеширование в Spring
Аннотации @Cacheable и @CacheEvict
Виды кеша в Spring и настройки конфигурации для Redis, Ehcache и Caffeine
Примеры использования кеша на примере Caffeine и Redis
——SPRING AOP——
Основы аспектно-ориентированного программирования (AOP) в Spring
Зачем нужно AOP?
Понятия Joinpoint, Pointcut, Advice
Создание простого аспекта
Аннотации @Before, @After, @Around
Примеры аспектов
Pointcut Expressions
Настройка AOP через XML и аннотации
Практическое использование AOP для логирования
Проверка авторизации для выполнения методов
Транзакционный менеджмент с помощью AOP
Все аннотации AOP и их использование
——SPRING SECURITY——
Введение в Spring Security
Основные принципы безопасности
Spring Security и его интеграция в проект
Аннотации используемые в Spring Security
Аутентификация и Авторизация в Spring Security
Проверка подлинности пользователя в Spring Security
OAuth2 Authentication
Использование базы данных для хранения пользователей в Spring Security
Настройка ролей и прав доступа в Spring Security
JWT (JSON Web Token)
Внедрение JWT-аутентификации в Spring Security
Обработка исключений в Spring Security
Настройка кастомных страниц ошибок в Spring Security
——REST——
REST и его архитектура
Принципы построения RESTful API
Форматы данных: JSON и XML
Настройка сериализации данных в Spring
Работа с HTTP-методами в Spring: GET, POST, PUT, DELETE
Создание CRUD API в Spring
Пагинация и фильтрация данных в REST API с использованием Spring
Обработка ошибок в REST API с использованием Spring Boot
Микросервисы в контексте Spring
Компоненты микросервисной архитектуры
——SPRING TEST——
Введение в тестирование в Spring
Аннотации JUnit 5
Продвинутые аннотации JUnit 5
Введение в Mockito
Проверка вызовов методов с помощью verify в Mockito
Аргумент-матчеры и частичное мокирование
Всё о thenReturn, thenThrow и thenAnswer в Mockito
Тестирование Spring компонентов
Интеграционные тесты с использованием базы данных
Тестирование веб-приложений в Spring
Написание тестов для CRUD REST API
Основы тестирования взаимодействия с базами данных в Spring
Нюансы и продвинутые сценарии тестирования с PostgreSQL
Тестирование сложных сценариев в Spring
Лучшие практики, советы и нюансы тестирования в Spring
——LOMBOK——
Введение в Lombok и базовые аннотации
Lombok, базовые аннотации
Аннотации для конструкторов
Аннотации для управления состоянием
Аннотации для логирования
Аннотации для работы с исключениями
Аннотации для работы с синхронизацией
Аннотации для работы с данными — @Value и @With
Создание кастомных аннотаций с использованием Lombok
Аннотации Lombok для работы с ресурсами, делегированием и утилитарными классами
Продвинутые аннотации Lombok и лучшие практики
Лучшие практики использования Lombok
#Contents
Если хотите найти информацию по Java, ранее опубликованную на канале - для Вас подготовлено оглавление уже из 5-и частей!
Часть 2 дополнена.
Читайте, используйте, будут вопросы - пишите!
Please open Telegram to view this post
VIEW IN TELEGRAM
Функциональное программирование
Функциональное программирование
Поддержка функционального программирования в Java
Stream API
Функциональные интерфейсы
Создание своего функционального интерфейса
Интерфейс Predicate<T>
Методы and, or, negate класса Predicate и их использование
Интерфейс Consumer<T> и метод accept
Более сложные сценарии использования Consumer
Интерфейс Supplier<T> и метод get
Более сложные сценарии использования Supplier
Интерфейс Function<T, R> и метод apply
Методы andThen, compose и их использование
Методы по умолчанию в интерфейсах (default методы)
Ссылки на методы (Method References)
Далее я продолжу наполнять оглавление!😉
#Contents
Функциональное программирование
Поддержка функционального программирования в Java
Stream API
Функциональные интерфейсы
Создание своего функционального интерфейса
Интерфейс Predicate<T>
Методы and, or, negate класса Predicate и их использование
Интерфейс Consumer<T> и метод accept
Более сложные сценарии использования Consumer
Интерфейс Supplier<T> и метод get
Более сложные сценарии использования Supplier
Интерфейс Function<T, R> и метод apply
Методы andThen, compose и их использование
Методы по умолчанию в интерфейсах (default методы)
Ссылки на методы (Method References)
Далее я продолжу наполнять оглавление!
#Contents
Please open Telegram to view this post
VIEW IN TELEGRAM
Java for Beginner pinned «☄️ Оглавление для обучающих постов. Если хотите найти информацию по Java, ранее опубликованную на канале - для Вас подготовлено оглавление уже из 5-и частей! ✔️ Пользуйтесь на здоровье! 🔜 Часть 1. 🔜 Часть 2. 🔜 Часть 3. SPRING 🔜 Часть 4. SPRING продолжение…»
Вопросы с собеседования 👩💻
Что такое checked и unchecked исключения?
Что такое checked и unchecked исключения?
Anonymous Quiz
75%
Checked исключения проверяются на этапе компиляции, а unchecked — во время выполнения.
2%
Checked исключения возникают только в потоках, а unchecked — в основном потоке.
15%
Checked исключения нельзя обработать, а unchecked — можно.
8%
Checked исключения относятся к ошибкам, а unchecked — к предупреждениям.
Please open Telegram to view this post
VIEW IN TELEGRAM
Создание своего функционального интерфейса
Вы можете создать свой функциональный интерфейс, если встроенные интерфейсы не подходят для ваших задач.
Для этого нужно:
Определить интерфейс с одним абстрактным методом.
Добавить аннотацию @FunctionalInterface.
Пример:
Использование интерфейса с лямбда-выражением
Теперь вы можете использовать этот интерфейс для создания лямбда-выражений:
Нюансы использования
Функциональные интерфейсы могут содержать default-методы и static-методы, но только один абстрактный метод.
Если вы используете аннотацию @FunctionalInterface, компилятор будет проверять, что интерфейс действительно функциональный.
Пример с default-методом
#Java #Training #Medium #Functional_programming #FunctionalInterface
Вы можете создать свой функциональный интерфейс, если встроенные интерфейсы не подходят для ваших задач.
Для этого нужно:
Определить интерфейс с одним абстрактным методом.
Добавить аннотацию @FunctionalInterface.
Пример:
@FunctionalInterface
interface Calculator {
int calculate(int a, int b);
}
Использование интерфейса с лямбда-выражением
Теперь вы можете использовать этот интерфейс для создания лямбда-выражений:
Calculator add = (a, b) -> a + b;
Calculator subtract = (a, b) -> a - b;
System.out.println(add.calculate(10, 5)); // 15
System.out.println(subtract.calculate(10, 5)); // 5
Нюансы использования
Функциональные интерфейсы могут содержать default-методы и static-методы, но только один абстрактный метод.
Если вы используете аннотацию @FunctionalInterface, компилятор будет проверять, что интерфейс действительно функциональный.
Пример с default-методом
@FunctionalInterface
interface Greeting {
void sayHello(String name);
default void sayGoodbye() {
System.out.println("Goodbye!");
}
}
public class Main {
public static void main(String[] args) {
Greeting greeting = name -> System.out.println("Hello, " + name);
greeting.sayHello("Alice"); // Hello, Alice
greeting.sayGoodbye(); // Goodbye!
}
}
#Java #Training #Medium #Functional_programming #FunctionalInterface