English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Функциональный интерфейс (Functional Interface) - это интерфейс, который имеет только один абстрактный метод, но может иметь несколько неабстрактных методов.
Функциональные интерфейсы могут быть имплицитно преобразованы в выражения lambda.
Выражения lambda и методные ссылки (действительно, это также выражения lambda).
Если определен функциональный интерфейс, например:
@FunctionalInterface interface GreetingService { void sayMessage(String message); }
Тогда можно использовать выражение lambda для представления одного из реализаций интерфейса (Примечание: до JAVA 8 обычно использовались анонимные классы):
GreetingService greetService1 = message -> System.out.println("Hello " + message);
Функциональные интерфейсы могут дружелюбно поддерживать lambda.
Функциональные интерфейсы, существовавшие до 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> представляет метод boolean с двумя параметрами. |
5 | BooleanSupplier представляет провайдера значения boolean. |
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> принимает объектного типа и параметр типа double в качестве входных параметров, не возвращает значения. |
33 | ObjIntConsumer<T> принимает объектного типа и параметр типа int в качестве входных параметров, не возвращает значения. |
34 | ObjLongConsumer<T> принимает объектного типа и параметр типа 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 в более сложные логические операции (например: и, или, не).
Этот интерфейс используется для проверки объектов на true или false.
Мы можем понять использование функционального интерфейса Predicate<T> на следующем примере (Java8Tester.java):
import java.util.Arrays; import java.util.List; import java.util.function.Predicate; public class Java8Tester { public static void main(String args[]){ List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); // Predicate<Integer> predicate = n -> true // n является параметром, переданным в метод test интерфейса Predicate // если n существует, метод test возвращает true System.out.println("输出所有数据:"); // передается параметр n eval(list, n -> true); // Predicate<Integer> predicate1 = n -> n % 2 == 0 // n является параметром, переданным в метод test интерфейса Predicate // если n % 2 равен 0, метод test возвращает true System.out.println("输出所有偶数:"); eval(list, n -> n % 2 == 0); // Predicate<Integer> predicate2 = n -> n > 3 // n является параметром, переданным в метод test интерфейса Predicate // Если n больше 3, метод test возвращает true System.out.println("Вывести все числа, превышающие 3:"); eval(list, n-> n > 3); } public static void eval(List<Integer> list, Predicate<Integer> predicate) { for(Integer n: list) { if(predicate.test(n)) { System.out.println(n + " "); } } } }
Выполните приведённый скрипт, результат выполнения будет:
$ 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