Функциональный интерфейс Java 8
Функциональный интерфейс (Functional Interface) — это интерфейс, который имеет ровно один абстрактный метод, но может иметь несколько неабстрактных методов.
Функциональные интерфейсы могут неявно преобразовываться в лямбда-выражения.
Лямбда-выражения и ссылки на методы (которые, вообще говоря, также можно считать лямбда-выражениями).
Например, определим функциональный интерфейс следующим образом:
@FunctionalInterface
interface GreetingService
{
void sayMessage(String message);
}
Затем можно использовать лямбда-выражение для представления реализации интерфейса (Примечание: до Java 8 обычно это реализовывалось с помощью анонимных классов):
GreetingService greetService1 = message -> System.out.println("Hello " + message);
Функциональные интерфейсы могут удобным образом поддерживать лямбда-выражения для существующих функций.
Функциональные интерфейсы, существовавшие до JDK 1.8:
- java.lang.Runnable
- java.util.concurrent.Callable
- java.security.PrivilegedAction
- java.util.Comparator
- java.io.FileFilter
- java.nio.file.PathMatcher
- java.lang.reflect.InvocationHandler
- java.beans.PropertyChangeListener
- java.awt.event.ActionListener
- javax.swing.event.ChangeListener
Функциональные интерфейсы, недавно добавленные в JDK 1.8:
- java.util.function
java.util.function содержит множество классов для поддержки функционального программирования в Java. Функциональные интерфейсы в этом пакете включают:
| Нет. | Интерфейс и описание |
|---|---|
| 1 | BiConsumer<T,U>
Представляет операцию, которая принимает два входных параметра и не возвращает результат. |
| 2 | BiFunction<T,U,R>
Представляет метод, который принимает два входных параметра и возвращает результат. |
| 3 | BinaryOperator<T>
Представляет операцию над двумя операндами одного типа и возвращает результат того же типа, что и операнды. |
| 4 | BiPredicate<T,U>
Представляет метод, возвращающий логическое значение, с двумя параметрами. |
| 5 | BooleanSupplier
Представляет поставщика результата логического типа. |
| 6 | Consumer<T>
Представляет операцию, которая принимает один входной параметр и не возвращает результат. |
| 7 | DoubleBinaryOperator
Представляет операцию над двумя операндами типа double, возвращающую результат типа double. |
| 8 | DoubleConsumer
Представляет операцию, которая принимает параметр типа double и не возвращает результат. |
| 9 | DoubleFunction<R>
Представляет метод, который принимает параметр типа double и возвращает результат. |
| 10 | DoublePredicate
Представляет метод, возвращающий значение типа boolean, с параметром типа double. |
| 11 | DoubleSupplier
Представляет поставщика результата типа double. |
| 12 | DoubleToIntFunction
Принимает входное значение типа double и возвращает результат типа int. |
| 13 | DoubleToLongFunction
Принимает входное значение типа double и возвращает результат типа long. |
| 14 | DoubleUnaryOperator
Принимает параметр типа double, и тип возвращаемого значения также double. |
| 15 | Function<T,R>
Принимает входной параметр и возвращает результат. |
| 16 | IntBinaryOperator
Принимает два параметра, оба типа int, и тип возвращаемого значения также int. |
| 17 | IntConsumer
Принимает входной параметр типа int, возвращаемое значение отсутствует. |
| 18 | IntFunction<R>
Принимает входной параметр типа int и возвращает результат. |
| 19 | IntPredicate
Принимает входной параметр типа int и возвращает результат типа boolean. |
| 20 | IntSupplier
Не принимает параметров, возвращает результат типа int. |
| 21 | IntToDoubleFunction
Принимает входное значение типа int и возвращает результат типа double. |
| 22 | IntToLongFunction
Принимает входное значение типа int и возвращает результат типа long. |
| 23 | IntUnaryOperator
Принимает параметр типа int, и тип возвращаемого значения также int. |
| 24 | LongBinaryOperator
Принимает два параметра, оба типа long, и тип возвращаемого значения также long. |
| 25 | LongConsumer
Принимает входной параметр типа long, возвращаемого значения нет. |
| 26 | LongFunction<R>
Принимает входной параметр типа long и возвращает результат. |
| 27 | LongPredicate
R принимает входной параметр типа long и возвращает результат типа boolean. |
| 28 | LongSupplier
Без параметров, возвращает значение типа long. |
| 29 | LongToDoubleFunction
Принимает входное значение типа long и возвращает результат типа double. |
| 30 | LongToIntFunction
Принимает входное значение типа long и возвращает результат типа int. |
| 31 | LongUnaryOperator
Принимает параметр типа long, и тип возвращаемого значения также long. |
| 32 | ObjDoubleConsumer<T>
Принимает входной параметр типа Object и типа double, возвращаемое значение отсутствует. |
| 33 | ObjIntConsumer<T>
Принимает входной параметр типа Object и типа int, возвращаемое значение отсутствует. |
| 34 | ObjLongConsumer<T>
Принимает входной параметр типа Object и входной параметр типа long, возвращаемое значение отсутствует. |
| 35 | Predicate<T>
Принимает входной параметр и возвращает результат типа boolean. |
| 36 | Supplier<T>
Без параметров, возвращает результат. |
| 37 | ToDoubleBiFunction<T,U>
Принимает два входных параметра и возвращает результат типа double. |
| 38 | ToDoubleFunction<T>
Принимает входной параметр и возвращает результат типа double. |
| 39 | ToIntBiFunction<T,U>
Принимает два входных параметра и возвращает результат типа int. |
| 40 | ToIntFunction<T>
Принимает входной параметр и возвращает результат типа int. |
| 41 | ToLongBiFunction<T,U>
Принимает два входных параметра и возвращает результат типа long. |
| 42 | ToLongFunction<T>
Принимает входной параметр и возвращает результат типа long. |
| 43 | UnaryOperator<T>
Принимает параметр типа T, и тип возвращаемого значения также T. |
Пример функционального интерфейса
Интерфейс Predicate<T> — это функциональный интерфейс, который принимает входной параметр T и возвращает результат типа boolean.
Этот интерфейс содержит различные методы по умолчанию для комбинирования Predicate в другую сложную логику (например: И, ИЛИ, НЕ).
Этот интерфейс используется для проверки, является ли объект истинным или ложным.
Мы можем узнать об использовании функционального интерфейса Predicate<T> из следующего примера (Java8Tester.java):
Файл Java8Tester.java
Выполните приведённый выше скрипт, результат вывода:
$ javac Java8Tester.java $ java Java8Tester 输出所有数据: 1 2 3 4 5 6 7 8 9 输出所有偶数: 2 4 6 8 输出大于 3 的所有数字: 4 5 6 7 8 9
Другие расширения
Новые возможности Java 8