Lambda 表达式是 Java 8 引入的一种新特性,用于提供一种更简洁的函数式编程方式。它允许你在代码中使用匿名函数(没有名称的函数),使得编写更简洁的代码成为可能。Lambda 表达式特别适用于实现接口中的单一抽象方法(通常称为函数式接口)。
Lambda 表达式的基本语法
Lambda 表达式的基本语法如下:
(parameters) -> expression
或
(parameters) -> { statements }
Lambda 表达式的组成部分
- 参数列表:括号中列出 Lambda 表达式的参数。如果没有参数,则用空括号
()
;如果有多个参数,使用逗号分隔。 - 箭头符号
->
:分隔参数列表和 Lambda 表达式的主体。 - 表达式或语句块:Lambda 表达式的主体部分。可以是单一表达式,也可以是多个语句。
示例
以下是一些使用 Lambda 表达式的示例:
示例 1:使用 Lambda 表达式实现 Runnable 接口
传统方式:
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("Runnable running...");
}
};
使用 Lambda 表达式:
Runnable runnable = () -> System.out.println("Runnable running...");
示例 2:使用 Lambda 表达式对集合进行排序
假设我们有一个 List
包含多个字符串,并希望按字符串长度排序:
传统方式:
import java.util.*;
public class LambdaExample {
public static void main(String[] args) {
List<String> list = Arrays.asList("banana", "apple", "pear");
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return Integer.compare(s1.length(), s2.length());
}
});
System.out.println(list);
}
}
使用 Lambda 表达式:
import java.util.*;
public class LambdaExample {
public static void main(String[] args) {
List<String> list = Arrays.asList("banana", "apple", "pear");
Collections.sort(list, (s1, s2) -> Integer.compare(s1.length(), s2.length()));
System.out.println(list);
}
}
示例 3:使用 Lambda 表达式处理 Stream API
假设我们有一个 List
包含多个整数,并希望筛选出大于 10 的整数,并将其平方:
传统方式:
import java.util.*;
public class LambdaExample {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(5, 12, 19, 8);
List<Integer> result = new ArrayList<>();
for (Integer i : list) {
if (i > 10) {
result.add(i * i);
}
}
System.out.println(result);
}
}
使用 Lambda 表达式和 Stream API:
import java.util.*;
import java.util.stream.Collectors;
public class LambdaExample {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(5, 12, 19, 8);
List<Integer> result = list.stream()
.filter(i -> i > 10)
.map(i -> i * i)
.collect(Collectors.toList());
System.out.println(result);
}
}
函数式接口
Lambda 表达式通常用于实现函数式接口。函数式接口是仅包含一个抽象方法的接口。常见的函数式接口包括:
java.util.function.Consumer<T>
java.util.function.Function<T, R>
java.util.function.Predicate<T>
java.util.function.Supplier<T>
这些接口的实例可以使用 Lambda 表达式来创建。
总结
Lambda 表达式让 Java 代码更加简洁、易读,并使得函数式编程风格得以实现。它们在处理集合和流时非常有用,使得代码更加清晰和高效。