函数式编程 - 函数式接口

函数式接口具有单一功能。例如,具有单一方法"compareTo"的 Comparable 接口用于比较目的。Java 8 定义了许多函数式接口,可广泛应用于 lambda 表达式中。以下是 java.util.Function 包中定义的函数式接口列表。

Sr.No. 接口 &描述
1

BiConsumer<T,U>

表示接受两个输入参数但不返回结果的操作。

2

BiFunction<T,U,R>

表示接受两个参数并产生结果的函数。

3

BinaryOperator<T>

表示对两个相同类型的操作数进行的操作,产生与操作数相同类型的结果操作数。

4

BiPredicate<T,U>

表示两个参数的谓词(布尔值函数)。

5

BooleanSupplier

表示布尔值结果的供应商。

6

Consumer<T>

表示接受单个输入参数且不返回任何结果的操作结果。

7

DoubleBinaryOperator

表示对两个双值操作数进行操作并产生双值结果。

8

DoubleConsumer

表示接受单个双值参数但不返回结果的操作。

9

DoubleFunction<R>

表示接受双值参数并产生结果。

10

DoublePredicate

表示一个双值参数的谓词(布尔值函数)。

11

DoubleSupplier

表示双值结果的供应商。

12

DoubleToIntFunction

表示接受双值参数并产生 int 值结果的函数。

13

DoubleToLongFunction

表示接受双值参数并产生长值结果的函数。

14

DoubleUnaryOperator

表示对单个双值操作数执行的操作,产生双值结果。

15

Function<T,R>

表示接受一个参数并产生结果的函数。

16

IntBinaryOperator

表示对两个 int 值操作数进行操作并产生一个 int 值结果。

17

IntConsumer

表示接受单个 int 值参数但不返回任何结果的操作。

18

IntFunction<R>

表示接受 int 值参数并产生结果的函数。

19

IntPredicate

表示一个 int 值参数的谓词(布尔值函数)。

20

IntSupplier

表示 int 值结果的供应商。

21

IntToDoubleFunction

表示接受 int 值参数并产生双值结果的函数。

22

IntToLongFunction

表示接受 int 值参数并产生长值结果的函数。

23

IntUnaryOperator

表示对单个 int 值操作数进行的操作,产生 int 值结果。

24

LongBinaryOperator

表示对两个长值操作数进行操作并产生长值结果。

25

LongConsumer

表示接受单个长值参数但不返回结果的操作。

26

LongFunction<R>

表示接受长值参数并产生结果的函数。

27

LongPredicate

表示一个长值参数的谓词(布尔值函数)。

28

LongSupplier

表示长值结果的供应商。

29

LongToDoubleFunction

表示接受长值参数并产生双值结果的函数结果。

30

LongToIntFunction

表示接受长值参数并产生 int 值结果的函数。

31

LongUnaryOperator

表示对单个长值操作数进行操作,产生长值结果。

32

ObjDoubleConsumer<T>

表示接受对象值和双值的操作参数,并且不返回任何结果。

33

ObjIntConsumer<T>

表示接受对象值和 int 值参数的操作,并且不返回任何结果。

34

ObjLongConsumer<T>

表示接受对象值和长值参数的操作,并且不返回任何结果。

35

谓词<T>

表示一个参数的谓词(布尔值函数)。

36

Supplier<T>

表示结果的提供者。

37

ToDoubleBiFunction<T,U>

表示接受两个参数并产生双值结果的函数。

38

ToDoubleFunction<T>

表示产生双值结果的函数。

39

ToIntBiFunction<T,U>

表示接受两个参数并产生一个 int 值结果。

40

ToIntFunction<T>

表示产生 int 值结果的函数。

41

ToLongBiFunction<T,U>

表示接受两个参数并产生一个 long 值结果的函数。

42

ToLongFunction<T>

表示产生长值结果。

43

UnaryOperator<T>

表示对单个操作数的操作,该操作产生与其操作数相同类型的结果。

函数式接口示例

Predicate <T> 接口是一个函数式接口,带有方法 test(Object) 以返回布尔值。此接口表示测试对象为真或假。

使用您选择的任何编辑器(例如,C:\> JAVA)创建以下 Java 程序。

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 作为参数传递给 Predicate 接口的测试方法
        // 无论 n 的值是什么,测试方法始终返回 true。
        
        System.out.println("打印所有数字:");
        
        //将 n 作为参数传递
        eval(list, n->true);
        
        // Predicate<Integer> predicate1 = n -> n%2 == 0
        // n 作为参数传递给 Predicate 接口的测试方法
        // 如果 n%2 为零,测试方法将返回 true
        
        System.out.println("打印偶数:");
        eval(list, n-> n%2 == 0 );
        
        // Predicate<Integer> predicate2 = n -> n > 3
        // n 作为参数传递给 Predicate 接口的测试方法
        // 如果 n 大于 3,则测试方法将返回 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 + " ");
         }
      }
   }
}

这里我们传递了 Predicate 接口,它接受单个输入并返回布尔值。

验证结果

使用 javac 编译器编译类,如下所示 −

C:\JAVA>javac Java8Tester.java

现在运行 Java8Tester,如下所示 −

C:\JAVA>java Java8Tester

它应该产生以下输出 −

Print all numbers:
1
2
3
4
5
6
7
8
9
Print even numbers:
2
4
6
8
Print numbers greater than 3:
4
5
6
7
8
9