在 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