Lambda表达式是一种可以看作是匿名函数的特殊语法形式,可以将函数作为参数传递给其他函数,或者在函数内部定义一个函数,使得代码更加简洁、易读,并且有助于减少冗余代码的编写。Lambda表达式最早出现在Lisp语言中,被称为Lambda演算(Lambda calculus),后来被Java和C#等编程语言提出并应用。
在Java语言中,Lambda表达式的使用是从Java 8版本开始引入的。Lambda表达式的格式很简单,它由参数列表、箭头符号和函数体构成。例如,以下是一个求平方的Lambda表达式:
(x) -> x*x
这个表达式中,左侧的 (x)
表示Lambda表达式的参数列表;箭头符号 ->
是Lambda表达式的分隔符,右侧的 x*x
则是Lambda表达式的函数体,表示将参数 x
自乘得到其平方值。
Lambda表达式可以被视为一个函数对象,它可以被存储在变量中,也可以被作为参数传递给其他函数。例如,以下是一个接受Lambda表达式作为参数的函数:
public static void processList(List<Integer> list, Function<Integer, Integer> f) {
for (int i = 0; i < list.size(); i++) {
list.set(i, f.apply(list.get(i)));
}
}
这个函数接受一个整型列表和一个函数对象 f
,对列表中的每一个元素调用 f
函数进行处理。其中 Function<Integer, Integer>
表示一个接收一个整型参数并返回一个整型结果的函数对象类型。现在,我们可以使用Lambda表达式作为参数调用这个函数:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
processList(list, (x) -> x * x); // 求平方
processList(list, (x) -> x + 1); // 求加一
在上面的代码中,我们分别使用 (x) -> x * x
和 (x) -> x + 1
两个Lambda表达式作为 processList
函数的第二个参数,来对列表中的每一个元素进行平方或加一的处理。
除了使用Lambda表达式作为参数传递给函数之外,我们还可以直接将Lambda表达式作为变量保存,例如:
Function<Integer, Integer> square = (x) -> x * x;
Function<Integer, Integer> increment = (x) -> x + 1;
在上面的代码中,我们定义了两个函数对象 square
和 increment
,分别用来求平方和加一。这样,在需要调用这些函数时,就可以直接使用它们:
int result = square.apply(5); // 25
result = increment.apply(5); // 6
Lambda表达式还可以用来创建线程和处理集合等数据类型。例如,以下是使用Lambda表达式处理列表中的数据:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
list.stream().filter(x -> x > 2).forEach(System.out::println);
这段代码使用 stream
函数将列表转换为一个流(Stream)类型,filter
函数通过Lambda表达式来过滤出大于2的数,forEach
函数输出每一个筛选后的元素。
总的来说,Lambda表达式是一种简单、灵活且有助于减少冗余代码编写的语法。它可以看作是一种匿名函数,可以作为参数传递给其他函数,或者在函数内部定义一个函数。在Java中,Lambda表达式的应用广泛,常用于处理集合等数据类型、创建线程以及各种回调函数等场景。