引言
Java 8 引入了 Lambda 表达式、Stream API 和 Optional,为集合数据处理和空值管理提供了更加简洁且安全的编程方式。Lambda 用于描述可传递的行为逻辑,Stream API 通过流水线模型对数据进行声明式处理,而 Optional 则显式建模'可能为空'的值,从而降低空指针异常的风险。
在执行层面,Stream API 同时支持串行流与并行流。串行流强调顺序性与可预测性,并行流则基于多线程机制提升计算效率,适用于 CPU 密集型场景。二者在保持统一编程模型的同时,为不同业务需求提供了灵活的执行选择。
1. Lambda 表达式:将行为逻辑作为参数传递
在传统 Java 编程中,方法参数通常只能传递数据,而无法直接传递'要执行的操作'。当需要将一段处理逻辑作为参数传入方法时,往往只能通过匿名内部类的方式实现,这不仅代码冗长,也削弱了逻辑本身的可读性。Lambda 表达式的引入,正是为了解决这一问题。
这里所说的'行为逻辑',本质上是指对某个输入执行的操作规则,例如如何处理一个元素、如何进行判断、如何完成一次计算等。Lambda 允许将这些操作规则以函数的形式进行传递,使代码能够直接表达'对数据做什么'。
// 匿名内部类:传递行为逻辑
list.forEach(new Consumer<Integer>() {
@Override
public void accept(Integer x) {
System.out.println(x);
}
});
// Lambda:更直观地描述行为
list.forEach(x -> System.out.println(x));
Lambda 表达式必须依附于函数式接口(Functional Interface)才能使用。所谓函数式接口,是指只包含一个抽象方法的接口,例如 Runnable、Comparator、Consumer 等。Lambda 并不是脱离接口存在的函数,而是函数式接口的简洁实现形式。
@FunctionalInterface
public interface Calculator {
int add(int a, int b);
}
// Lambda 实现函数式接口
Calculator calc = (a, b) -> a + b;
通过 Lambda,Java 在保持类型安全的前提下,实现了对'行为抽象'的简化表达,为后续 Stream API 的设计奠定了基础。
关于类型安全 程序在编译期和运行期,能够保证变量、表达式和方法调用只会以符合其声明类型的方式被使用,从而避免不合法的类型操作。一个简单的例子是尝试将 String 赋值给 Integer,这会在编译期直接报错。
2. Stream API:基于流水线模型的数据处理机制
2.1 Stream 的核心思想:描述数据如何被处理
Stream API 并不是一种新的集合结构,而是对集合数据处理过程的一种抽象描述。它的设计目标并非替代 List 或 Set,而是将原本分散在多层循环和条件判断中的逻辑,组织为一条清晰、可组合的数据处理流水线。
// 传统写法:多层循环 + 条件判断(逻辑分散)
List<Long> result = <>();
(Order order : orders) {
(order.isPaid()) {
(order.getAmount() > ) {
(!blackList.contains(order.getUserId())) {
result.add(order.getId());
}
}
}
}


