在 Java 中,所有方法参数都有固定的类型。假如将数字 10 作为参数传递给一个方法,则参数的类型是 int。例如:
public void myMethod(int arg) {
//...
}那么,Lambda 表达式的类型又是什么呢?函数接口就是 Lambda 表达式的类型。
Java8 引入了函数接口(Functional Interface)的概念,函数接口指只有一个抽象方法的接口,可以使用 Lambda 表达式或方法引用来实现该接口。
示例:自定义一个函数接口,采用 Lambda 表达式的方式去使用它,如下:
package com.hxstrive.jdk8.lambda;
/**
* 定义函数接口
* @author hxstrive.com
*/
public class Demo03 {
public static void main(String[] args) {
test((msg) -> {
return "[" + msg + "]";
}, "hello world");
}
private static void test(MyInterface myInterface, String msg) {
System.out.println(myInterface.show(msg));
}
}
// 自定义函数接口
interface MyInterface {
// 一个抽象接口
String show(String msg);
}运行代码,输出如下:
[hello world]
Java8 中提供了一些常用的函数接口,如下:
Consumer<T>:接受一个 T 类型的输入参数,没有返回值。
Supplier<T>:不接受任何输入参数,返回一个 T 类型的值。
Function<T, R>:接受一个 T 类型的输入参数,返回一个 R 类型的值。
Predicate<T>:接受一个 T 类型的输入参数,返回一个布尔值。
UnaryOperator<T>:接受一个 T 类型的输入参数,返回一个 T 类型的值。
BinaryOperator<T>:接受两个 T 类型的输入参数,返回一个 T 类型的值。
注意,这些函数接口都定义在 java.util.function 包中,可以直接使用。使用函数接口可以使代码更简洁、易读和易于维护,同时也可以提高代码的可重用性和可测试性。
示例:使用 Function<T,R> 函数接口实现输入字符串,返回输入字符串的长度。如下:
package com.hxstrive.jdk8.lambda;
import java.util.function.Function;
/**
* 使用Java内置的 Function<T, R> 函数接口
* @author hxstrive.com
*/
public class Demo04 {
public static void main(String[] args) {
int len = calcStrLen((str) -> str.length(), "hello world");
System.out.println("len=" + len);
}
private static int calcStrLen(Function<String, Integer> function, String str) {
return function.apply(str);
}
}运行示例,输出如下:
len=11