Lambda 表达式的语法:
在 Java 中,Lambda 表达式(也称为匿名方法)是一种简洁的表示方法接口(Functional Interface)实现的方式。它是 Java 8 引入的特性,目的是提高代码的简洁性和可读性。
Lambda 表达式的语法:
Lambda 表达式的基本语法结构如下:
(parameters) -> expression
- parameters: 输入参数,类型可以省略,编译器会根据上下文推断。
- ->: Lambda 表达式的箭头符号,用于分隔参数和方法体。
- expression: 方法体,方法体可以是一个简单的表达式或者是一个代码块。
Lambda 表达式的主要特征:
- 简化代码:使代码更加简洁。
- 支持函数式编程:Lambda 表达式使得 Java 可以实现函数式编程。
- 支持传递行为:Lambda 让代码行为可以作为参数传递。
Lambda 表达式的基本用法
Lambda 表达式通常用于实现 Java 中的 函数式接口(Functional Interface)。函数式接口是只包含一个抽象方法的接口,例如:Runnable
、Comparator
、Callable
等。
示例 1: 使用 Lambda 表达式替代匿名内部类
我们首先看一个使用匿名内部类的代码示例,然后用 Lambda 表达式进行简化。
1.1. 匿名内部类示例:
假设我们有一个 Runnable
接口的实例,用来创建一个线程。
public class LambdaExample {
public static void main(String[] args) {
// 使用匿名内部类实现Runnable接口
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("Hello from the thread!");
}
};
// 创建线程并启动
Thread thread = new Thread(runnable);
thread.start();
}
}
1.2. 使用 Lambda 表达式简化:
Lambda 表达式可以将上述匿名内部类简化为更简洁的形式:
public class LambdaExample {
public static void main(String[] args) {
// 使用 Lambda 表达式简化
Runnable runnable = () -> System.out.println("Hello from the thread!");
// 创建线程并启动
Thread thread = new Thread(runnable);
thread.start();
}
}
在这个例子中,Lambda 表达式 () -> System.out.println("Hello from the thread!")
替代了匿名内部类。
示例 2: 使用 Lambda 表达式处理集合(List)
Java 8 引入了流(Stream)API,可以非常方便地对集合进行操作。我们可以使用 Lambda 表达式和流 API 对集合进行过滤、排序和遍历等操作。
2.1. 传统方式:使用 for
循环遍历集合
import java.util.Arrays;
import java.util.List;
public class LambdaExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
// 使用传统的 for 循环遍历集合
for (String name : names) {
System.out.println(name);
}
}
}
2.2. 使用 Lambda 表达式与 Stream API 遍历集合
使用 Lambda 表达式和 forEach
方法来遍历集合:
import java.util.Arrays;
import java.util.List;
public class LambdaExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
// 使用 Lambda 表达式与 forEach 遍历集合
names.forEach(name -> System.out.println(name));
}
}
forEach
是 Stream
接口的一个方法,可以接受一个 Consumer
类型的参数,而 Consumer
接口只有一个方法 accept
,所以我们可以传入 Lambda 表达式来替代匿名内部类。
示例 3: 使用 Lambda 表达式进行排序
Lambda 表达式可以用来简化比较器的实现。
3.1. 使用匿名内部类排序:
import java.util.Arrays;
import java.util.Comparator;
public class LambdaExample {
public static void main(String[] args) {
String[] names = {"Alice", "Bob", "Charlie", "David"};
// 使用匿名内部类排序
Arrays.sort(names, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
System.out.println(Arrays.toString(names));
}
}
3.2. 使用 Lambda 表达式排序:
import java.util.Arrays;
public class LambdaExample {
public static void main(String[] args) {
String[] names = {"Alice", "Bob", "Charlie", "David"};
// 使用 Lambda 表达式排序
Arrays.sort(names, (o1, o2) -> o1.compareTo(o2));
System.out.println(Arrays.toString(names));
}
}
示例 4: 函数式接口的使用
Java 8 引入了大量的函数式接口(例如 Predicate
, Function
, Consumer
, Supplier
等)。我们可以通过 Lambda 表达式来实现这些接口。
4.1. 使用 Lambda 表达式实现 Predicate
接口
Predicate
接口用于判断某个条件是否成立,它有一个抽象方法 test
。
import java.util.function.Predicate;
public class LambdaExample {
public static void main(String[] args) {
// 使用 Lambda 表达式创建 Predicate 接口实例
Predicate<Integer> isEven = num -> num % 2 == 0;
System.out.println(isEven.test(4)); // true
System.out.println(isEven.test(5)); // false
}
}
4.2. 使用 Lambda 表达式实现 Function
接口
Function
接口用于将输入参数转换为输出结果,它有一个抽象方法 apply
。
import java.util.function.Function;
public class LambdaExample {
public static void main(String[] args) {
// 使用 Lambda 表达式创建 Function 接口实例
Function<Integer, Integer> square = num -> num * num;
System.out.println(square.apply(4)); // 16
System.out.println(square.apply(5)); // 25
}
}
小结:
- Lambda 表达式使代码更加简洁。
- 适用于实现 函数式接口,即只有一个抽象方法的接口。
- Lambda 表达式可以替代匿名内部类,使得代码更加简洁易懂。
- Java 8 的 Stream API 与 Lambda 表达式结合,可以非常方便地处理集合。
通过这些示例,你可以看到如何在 Java 中使用 Lambda 表达式提高代码的简洁性和可读性。