Lambda表达式是Java 8中新增的一种语法,它使得Java语言变得更加简洁、高效。Lambda表达式就是将一个匿名内部类的实现变成了一种函数式风格,被称为“函数式编程”,同时Java 8中也新增了许多函数式接口来支持Lambda表达式,为Java程序员提供了更多的选择。
Lambda表达式可以认为是一个匿名函数,它没有名称,但它可以接收参数,执行代码,并返回结果。一个Lambda表达式可以看作是一个函数式接口的实例,函数式接口是只有一个抽象方法的接口。Lambda表达式与匿名内部类不同之处在于,Lambda表达式没有单独的类定义,而是直接写在代码中。
Lambda表达式的语法如下:
(parameter1, parameter2, …) -> { // lambda body }
其中,参数列表可以为空,也可以包含多个参数,多个参数之间用逗号分隔;箭头符号 " -> " 将参数列表和Lambda表达式的主体分开,箭头符号之前的是参数列表,箭头符号之后的是Lambda表达式的主体。
例如:
// 定义一个接口 MyInterface
interface MyInterface {
void doSomething();
}
// 使用 Lambda 表达式实现
MyInterface myInterface = () -> System.out.println("Hello World!");
myInterface.doSomething();
将输出:Hello World!
函数式接口是只有一个抽象方法的接口,Java 8中新增了许多函数式接口,这些函数式接口是对Lambda表达式的支持。函数式接口从功能上来看可以与以前的单抽象方法接口等价,但比单抽象方法接口更容易使用和理解。Java中有11个预定义的函数式接口,这些接口都在包 java.util.function
中,下面介绍其中几个重要的函数式接口。
Consumer是函数式接口,它接收一个输入参数,但没有返回任何输出结果,使用的语法为:
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
其中,T
是输入参数的类型,accept
方法接收一个输入参数,并处理它。
例如:
// 使用 Lambda 形式的 Consumer 接口
Consumer<String> consumer = x -> System.out.println(x.toUpperCase());
consumer.accept("hello world"); // 输出:HELLO WORLD
Function 是函数式接口,它接收一个输入参数,并返回一个输出结果,使用的语法为:
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
}
其中,T
是输入参数的类型,R
是输出结果的类型,apply
方法接收一个输入参数,并返回处理后的结果。
例如:
// 使用 Lambda 形式的 Function 接口
Function<Integer, String> function = x -> String.valueOf(x * 2);
String result = function.apply(5);
System.out.println(result); // 输出:10
Predicate 是函数式接口,它接收一个输入参数,并返回一个布尔值结果,使用的语法为:
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
}
其中,T
是输入参数的类型,test
方法接收一个输入参数,并返回一个布尔值结果。
例如:
// 使用 Lambda 形式的 Predicate 接口
Predicate<String> predicate = x -> x.length() > 5;
boolean result = predicate.test("Hello World");
System.out.println(result); // 输出:true
假设有一个自定义的函数式接口 DefineFunction
,它有两个输入参数类型 Double
,并且有一个返回类型为 Double
的方法 calculate
。现在使用 Lambda 表达式计算两个数的乘积,该如何实现呢?
定义函数式接口:
@FunctionalInterface
public interface DefineFunction {
Double calculate(Double x, Double y);
}
使用 Lambda 表达式计算两个数的乘积:
DefineFunction defineFunction = (x, y) -> x * y;
Double result = defineFunction.calculate(2.0, 3.0);
System.out.println(result); // 输出:6.0
假设有一个字符串列表 list
,现在需要将列表中的每个元素都转为大写,并输出。使用 Lambda 表达式的 Consumer 接口,可以非常简单地完成该任务。
处理代码如下:
List<String> list = Arrays.asList("hello", "world", "!");
list.forEach(x -> System.out.println(x.toUpperCase()));
输出结果为:
HELLO
WORLD
!
上述示例中,list
是一个字符串类型的列表,使用 Arrays.asList()
方法将字符串转为集合;forEach
方法是Java 8中新增的方法,它接收一个 Consumer 接口的实现作为参数,对集合中的每个元素进行处理,使用 Lambda 表达式的语法可以非常简单地对列表中的每个元素进行处理,实现了将列表中的每个元素都转成大写。