Какие знаешь функциональные особенности в Java?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Функциональные особенности в Java
Java 8+ включила мощные функциональное программирование возможности, которые трансформировали способ написания кода. Это означает использование функций как значений первого класса.
1. Lambda выражения
Lambda это анонимная функция, которая позволяет писать код компактнее и понятнее:
// Без lambda (старый способ)
Button button = new Button();
button.setOnClickListener(new OnClickListener() {
public void onClick() {
System.out.println("Clicked!");
}
});
// С lambda (современный способ)
button.setOnClickListener(() -> System.out.println("Clicked!"));
2. Functional Interfaces
Функциональный интерфейс это интерфейс с одним абстрактным методом. Он может быть реализован через lambda:
public interface Calculator {
int calculate(int a, int b);
}
Calculator add = (a, b) -> a + b;
Calculator multiply = (a, b) -> a * b;
int result1 = add.calculate(5, 3); // 8
int result2 = multiply.calculate(5, 3); // 15
Встроенные функциональные интерфейсы:
- Function преобразует T в R
- Predicate возвращает boolean
- Consumer выполняет действие, не возвращает результат
- Supplier возвращает значение, не принимает параметров
- BiFunction принимает два параметра
3. Streams API
Stream это абстракция для работы с последовательностями данных функциональным способом:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
List<Integer> result = numbers.stream()
.filter(n -> n > 2)
.map(n -> n * 2)
.collect(Collectors.toList());
Основные операции:
- filter() отфильтровать элементы
- map() преобразовать каждый элемент
- flatMap() преобразовать и развернуть
- reduce() свернуть в один результат
- forEach() выполнить действие
- sorted() отсортировать
- distinct() удалить дубликаты
4. Method References
Method reference это более компактный способ использования lambda:
Function<String, Integer> parseInt = Integer::parseInt;
Consumer<String> print = System.out::println;
String str = "hello";
Supplier<Integer> length = str::length;
Supplier<StringBuilder> supplier = StringBuilder::new;
5. Optional для обработки null
Optional это контейнер, который может содержать значение или быть пустым:
Optional<String> name = Optional.of("John");
if (name.isPresent()) {
System.out.println(name.get());
}
name.ifPresent(System.out::println);
String result = name.orElse("Unknown");
6. Параллельные потоки
Parallel Stream позволяет обрабатывать данные параллельно:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
int sum = numbers.parallelStream()
.filter(n -> n % 2 == 0)
.map(n -> n * n)
.reduce(0, Integer::sum);
Преимущества функционального подхода
- Читаемость: код становится более декларативным
- Переиспользование: функции легче комбинировать
- Параллелизм: проще написать параллельный код
- Тестируемость: pure функции легче тестировать
- Меньше ошибок: меньше состояния означает меньше bugs
Функциональный стиль позволяет писать более выразительный и надёжный Java код.