📅  最后修改于: 2023-12-03 15:31:58.076000             🧑  作者: Mango
在Java SE 8及之后的版本中,引入了函数式接口的概念,它是用来支持Lambda表达式的。函数式接口定义了只有一个抽象方法的接口,可以被Lambda表达式所应用。
Java的函数式接口中,通常只有一个未实现的方法,称为函数式方法。函数式方法在函数式接口中的类型是唯一确定的,具有函数式接口类型的变量只能用来表示实现了该函数式接口的Lambda表达式。例如:
@FunctionalInterface
interface SomeFunctionalInterface {
void doSomething();
}
上述代码中定义了一个函数式接口SomeFunctionalInterface
,只有一个未实现的方法doSomething()
。其中@FunctionalInterface
注解并不是必须的,但它可以确保该接口是一个函数式接口,如果在接口内尝试添加第二个抽象方法,编译器会直接抛出编译错误。
Java SE 8引入的函数式接口主要有以下几个:
Consumer接口是一个消费者接口,可以接受一个输入参数,并对其进行某些操作,但没有返回值。它有一个抽象方法void accept(T t)
。
例如,下面的代码使用Consumer接口打印出一个字符串数组:
Consumer<String> myConsumer = new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
};
String[] strArr = {"apple", "banana", "orange"};
Arrays.stream(strArr).forEach(myConsumer);
上述代码中,定义了一个Consumer接口实例,并通过forEach方法使用该实例打印了一个字符串数组。
Predicate接口是一个判断接口,它接受一个输入参数,返回一个布尔值。它有一个抽象方法boolean test(T t)
。
例如,下面的代码使用Predicate接口判断一个字符串是否为空:
Predicate<String> isNotNull = new Predicate<String>() {
@Override
public boolean test(String s) {
return s != null;
}
};
String str = null;
System.out.println(isNotNull.test(str)); // false
上述代码中,定义了一个Predicate接口实例并测试了一个字符串的值是否为空。
Function接口是一个转换函数接口,它接受一个输入参数,返回一个输出结果,可以用于对输入的数据进行转换。它有一个抽象方法R apply(T t)
。
例如,下面的代码使用Function接口将一个整型数值转换为一个字符串:
Function<Integer, String> intToString = new Function<Integer, String>() {
@Override
public String apply(Integer i) {
return i.toString();
}
};
int i = 123;
System.out.println(intToString.apply(i)); // "123"
上述代码中,定义了一个Function接口实例并将一个整型数值转换为了一个字符串。
Supplier接口是一个提供者接口,不接受任何输入参数,直接返回一个输出结果。它有一个抽象方法T get()
。
例如,下面的代码使用Supplier接口生成一个随机数:
Supplier<Integer> intSupplier = new Supplier<Integer>() {
@Override
public Integer get() {
return new Random().nextInt(100);
}
};
System.out.println(intSupplier.get());
上述代码中,定义了一个Supplier接口实例并生成了一个随机数。
Lambda表达式可以理解为一种匿名函数的简洁写法,可以用来表示一个函数式方法。Lambda表达式的语法结构如下:
(parameters) -> expression
例如,下面的代码使用Lambda表达式创建了一个Consumer接口实例并打印出一个整型数组:
Consumer<Integer> printIntArr = (arr) -> {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
};
int[] intArr = {1, 2, 3, 4, 5};
printIntArr.accept(intArr);
上述代码中,使用Lambda表达式创建了一个Consumer接口实例,实现了接口方法并遍历并打印了一个整型数组。