目录
[3.1、无参数的 Lambda 表达式](#3.1、无参数的 Lambda 表达式)
[3.2、单个参数的 Lambda 表达式](#3.2、单个参数的 Lambda 表达式)
[3.3、多个参数的 Lambda 表达式](#3.3、多个参数的 Lambda 表达式)
[3.4、带语句块的 Lambda 表达式](#3.4、带语句块的 Lambda 表达式)
[5、Lambda 表达式的变量作用域](#5、Lambda 表达式的变量作用域)
[6、Lambda 表达式的限制](#6、Lambda 表达式的限制)
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 表达式,你可以编写更简洁、更易读的代码,尤其是在处理集合、多线程和事件驱动编程时。