Що таке функціональний інтерфейс?
Настав час детально розглянути, як створюються лямбда-вирази у Java та яке відношення до них мають функціональні інтерфейси.
Функціональний інтерфейс може використовуватися для представлення дії або операції, яку можна виконати. Замість створення окремого класу для простої задачі, можна визначити інтерфейс з одним методом, який описує цю дію.
Приклад функціонального інтерфейсу:
@FunctionalInterface
public interface MyFunctionalInterface {
void myMethod(); // The only abstract method
}
Анотація @FunctionalInterface є необов'язковою, але вона допомагає компілятору та розробникам, забезпечуючи, що інтерфейс залишається функціональним і запобігає додаванню декількох абстрактних методів.
Навіщо вони потрібні?
У Stream API функціональні інтерфейси використовуються для передачі різних поведінок у методи, що працюють із колекціями даних.
Наприклад, можна передати умову фільтрації до методу, який вибирає певні елементи зі списку, або надати операцію для перетворення кожного елемента, як це реалізовано в методах filter() та map().
Main.java
1234567891011121314151617package com.example; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6); // Using `filter()` to extract even numbers List<Integer> evenNumbers = numbers.stream() .filter(n -> n % 2 == 0) // Predicate: keeps only even numbers .collect(Collectors.toList()); System.out.println(evenNumbers); } }
Метод filter() приймає спеціальний функціональний інтерфейс під назвою Predicate<T> (який буде розглянуто пізніше), що перевіряє, чи відповідає елемент певній умові. У цьому випадку лямбда-вираз n -> n % 2 == 0 визначає, чи є число парним. Якщо число ділиться на 2 без залишку, воно залишається у потоці.
Створення власного функціонального інтерфейсу
Припустимо, потрібен інтерфейс для виконання арифметичних операцій, таких як додавання або віднімання.
Можна створити функціональний інтерфейс з назвою ArithmeticOperation з методом apply, який виконує операцію над двома числами, a та b.
@FunctionalInterface
public interface ArithmeticOperation {
int apply(int a, int b); // Method to perform an operation on two numbers
}
Тепер, маючи інтерфейс, можна використовувати лямбда-вирази для визначення різних операцій, таких як додавання та віднімання:
Main.java
1234567891011public class Main { public static void main(String[] args) { // Addition ArithmeticOperation add = (a, b) -> a + b; System.out.println("Sum: " + add.apply(5, 3)); // 8 // Subtraction ArithmeticOperation subtract = (a, b) -> a - b; System.out.println("Difference: " + subtract.apply(5, 3)); // 2 } }
Лямбда-вирази (a, b) -> a + b та (a, b) -> a - b реалізують метод apply інтерфейсу, виконуючи відповідно додавання та віднімання. Перший лямбда-вираз повертає суму двох чисел, а другий — їхню різницю.
Такий підхід забезпечує гнучкий спосіб використання різних арифметичних операцій без необхідності створювати окремі класи для кожної з них.
1. Що таке функціональний інтерфейс у Java?
2. Який лямбда-вираз коректно реалізує наступний функціональний інтерфейс?
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
Awesome!
Completion rate improved to 2.33
Що таке функціональний інтерфейс?
Свайпніть щоб показати меню
Настав час детально розглянути, як створюються лямбда-вирази у Java та яке відношення до них мають функціональні інтерфейси.
Функціональний інтерфейс може використовуватися для представлення дії або операції, яку можна виконати. Замість створення окремого класу для простої задачі, можна визначити інтерфейс з одним методом, який описує цю дію.
Приклад функціонального інтерфейсу:
@FunctionalInterface
public interface MyFunctionalInterface {
void myMethod(); // The only abstract method
}
Анотація @FunctionalInterface є необов'язковою, але вона допомагає компілятору та розробникам, забезпечуючи, що інтерфейс залишається функціональним і запобігає додаванню декількох абстрактних методів.
Навіщо вони потрібні?
У Stream API функціональні інтерфейси використовуються для передачі різних поведінок у методи, що працюють із колекціями даних.
Наприклад, можна передати умову фільтрації до методу, який вибирає певні елементи зі списку, або надати операцію для перетворення кожного елемента, як це реалізовано в методах filter() та map().
Main.java
1234567891011121314151617package com.example; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6); // Using `filter()` to extract even numbers List<Integer> evenNumbers = numbers.stream() .filter(n -> n % 2 == 0) // Predicate: keeps only even numbers .collect(Collectors.toList()); System.out.println(evenNumbers); } }
Метод filter() приймає спеціальний функціональний інтерфейс під назвою Predicate<T> (який буде розглянуто пізніше), що перевіряє, чи відповідає елемент певній умові. У цьому випадку лямбда-вираз n -> n % 2 == 0 визначає, чи є число парним. Якщо число ділиться на 2 без залишку, воно залишається у потоці.
Створення власного функціонального інтерфейсу
Припустимо, потрібен інтерфейс для виконання арифметичних операцій, таких як додавання або віднімання.
Можна створити функціональний інтерфейс з назвою ArithmeticOperation з методом apply, який виконує операцію над двома числами, a та b.
@FunctionalInterface
public interface ArithmeticOperation {
int apply(int a, int b); // Method to perform an operation on two numbers
}
Тепер, маючи інтерфейс, можна використовувати лямбда-вирази для визначення різних операцій, таких як додавання та віднімання:
Main.java
1234567891011public class Main { public static void main(String[] args) { // Addition ArithmeticOperation add = (a, b) -> a + b; System.out.println("Sum: " + add.apply(5, 3)); // 8 // Subtraction ArithmeticOperation subtract = (a, b) -> a - b; System.out.println("Difference: " + subtract.apply(5, 3)); // 2 } }
Лямбда-вирази (a, b) -> a + b та (a, b) -> a - b реалізують метод apply інтерфейсу, виконуючи відповідно додавання та віднімання. Перший лямбда-вираз повертає суму двох чисел, а другий — їхню різницю.
Такий підхід забезпечує гнучкий спосіб використання різних арифметичних операцій без необхідності створювати окремі класи для кожної з них.
1. Що таке функціональний інтерфейс у Java?
2. Який лямбда-вираз коректно реалізує наступний функціональний інтерфейс?
Дякуємо за ваш відгук!