目录
1、Lambda简介
2、语法介绍
3、Lambda表达式示例
3.1、无参数的 Lambda 表达式
3.2、单个参数的 Lambda 表达式
3.3、多个参数的 Lambda 表达式
3.4、带语句块的 Lambda 表达式
4、Lambda使用场景
4.1、替代匿名内部类
4.2、集合操作
4.3、排序
4.4、函数式接口
4.4.1、自定义函数式接口
4.4.2、常用内置函数式接口
4.5、方法引用
4.5.1、静态方法引用
4.5.2、实例方法引用
4.5.3、构造方法引用
5、Lambda 表达式的变量作用域
6、Lambda 表达式的限制
7、总结
1、Lambda简介
Java 8 引入了 Lambda 表达式,这是 Java 语言的一个重要特性,使得代码更加简洁和易读。Lambda 表达式允许你将功能作为方法参数传递,或者将代码作为数据来处理。
2、语法介绍
java">(parameters) -> expression
或者
java">(parameters) -> { statements; }
-
parameters: 参数列表,可以为空或包含一个或多个参数。
-
->: Lambda 操作符,将参数和表达式或语句块分开。
-
expression: 单个表达式,Lambda 表达式会返回该表达式的结果。
-
{ statements; }: 语句块,可以包含多条语句,需要使用
return
语句返回值(如果有返回值)。
3、Lambda表达式示例
3.1、无参数的 Lambda 表达式
java">() -> System.out.println("Hello, World!");
3.2、单个参数的 Lambda 表达式
java">x -> x * x
3.3、多个参数的 Lambda 表达式
java">(x, y) -> x + y
3.4、带语句块的 Lambda 表达式
java">(x, y) -> {
int sum = x + y;
return sum;
}
4、Lambda使用场景
4.1、替代匿名内部类
Lambda 表达式常用于替代匿名内部类,尤其是在使用函数式接口时。
java">// 使用匿名内部类
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("Hello, World!");
}
};
// 使用 Lambda 表达式
Runnable r2 = () -> System.out.println("Hello, World!");
4.2、集合操作
Lambda 表达式可以与 Java 8 引入的 Stream API 结合使用,简化集合操作。
java">List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
// 使用 Lambda 表达式遍历集合
names.forEach(name -> System.out.println(name));
// 使用 Lambda 表达式过滤集合
List<String> filteredNames = names.stream()
.filter(name -> name.startsWith("A"))
.collect(Collectors.toList());
4.3、排序
Lambda 表达式可以简化排序操作。
java">List<String> names = Arrays.asList("Charlie", "Alice", "Bob");
// 使用 Lambda 表达式排序
names.sort((a, b) -> a.compareTo(b));
4.4、函数式接口
Lambda 表达式通常与函数式接口一起使用。函数式接口是只包含一个抽象方法的接口。Java 8 提供了许多内置的函数式接口,如 Runnable
、Callable
、Comparator
等。
4.4.1、自定义函数式接口
你可以定义自己的函数式接口,然后使用表达式实现。
java">@FunctionalInterface
interface MyFunctionalInterface {
void myMethod();
}
MyFunctionalInterface mfi = () -> System.out.println("My Method");
mfi.myMethod();
4.4.2、常用内置函数式接口
-
Predicate<T>
: 接受一个参数并返回一个布尔值。 -
Consumer<T>
: 接受一个参数并执行操作,不返回任何结果。 -
Function<T, R>
: 接受一个参数并返回一个结果。 -
Supplier<T>
: 不接受参数,返回一个结果。
4.5、方法引用
方法引用是 Lambda 表达式的一种简化形式,用于直接引用已有方法。
4.5.1、静态方法引用
java">List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.forEach(System.out::println);
4.5.2、实例方法引用
java">String str = "Hello";
Supplier<Integer> lengthSupplier = str::length;
System.out.println(lengthSupplier.get());
4.5.3、构造方法引用
java">Supplier<List<String>> listSupplier = ArrayList::new;
List<String> list = listSupplier.get();
5、Lambda 表达式的变量作用域
Lambda 表达式可以访问外部的局部变量,但这些变量必须是 final
或事实上是 final
的(即不可变)。
java">int num = 10;
Runnable r = () -> System.out.println(num); // num 必须是 final 或事实上是 final
6、Lambda 表达式的限制
-
Lambda 表达式只能用于函数式接口。
-
Lambda 表达式不能包含
break
或continue
语句。 -
Lambda 表达式不能抛出检查异常(除非函数式接口允许)。
7、总结
Java 8 的 Lambda 表达式极大地简化了代码,使得函数式编程在 Java 中变得更加容易。通过 Lambda 表达式,你可以编写更简洁、更易读的代码,尤其是在处理集合、多线程和事件驱动编程时。