Java函数式编程实战:Lambda与Stream深度应用指南
一、Lambda表达式核心语法
Java 8引入的Lambda使代码更简洁,替代匿名内部类:
// 传统匿名内部类
Runnable runnable1 = new Runnable() {
@Override
public void run() {
System.out.println("Hello World");
}
};
// Lambda等效实现
Runnable runnable2 = () -> System.out.println("Hello World");
// 带参数的Lambda
Comparator<String> comparator =
(s1, s2) -> s1.compareToIgnoreCase(s2);
语法结构:(parameters) -> expression
或 (parameters) -> { statements; }
二、函数式接口应用
1. 内置四大核心接口
// 1. Consumer-消费型
Consumer<String> printer = s -> System.out.println(s);
// 2. Supplier-供给型
Supplier<LocalDate> dateSupplier = LocalDate::now;
// 3. Function-函数型
Function<String, Integer> parser = Integer::parseInt;
// 4. Predicate-断言型
Predicate<String> validator = s -> s.length() > 5;
2. 自定义函数式接口
@FunctionalInterface
interface TriFunction<T, U, V, R> {
R apply(T t, U u, V v);
}
// 使用示例
TriFunction<Integer, Integer, Integer, Integer> sum =
(a, b, c) -> a + b + c;
三、Stream API实战技巧
1. 集合处理流水线
List<Product> products = getProducts();
List<String> names = products.stream()
.filter(p -> p.getPrice() > 100) // 过滤
.sorted(comparing(Product::getPrice)) // 排序
.map(Product::getName) // 转换
.limit(10) // 限制
.collect(Collectors.toList()); // 收集
2. 并行流性能优化
long count = largeList.parallelStream()
.filter(item -> item.getValue() > 50)
.count(); // 自动利用多核CPU
四、方法引用精要
类型 | 语法 | 示例 |
---|---|---|
静态方法 | ClassName::staticMethod | Integer::parseInt |
实例方法 | instance::method | System.out::println |
构造方法 | ClassName::new | ArrayList::new |
五、实战案例:电商系统
1. 订单处理流水线
// 计算VIP用户订单总金额
double total = orders.stream()
.filter(o -> o.getUser().isVip())
.flatMap(o -> o.getItems().stream())
.mapToDouble(OrderItem::getTotalPrice)
.sum();
// 按类别分组统计
Map<String, Long> categoryCount = products.stream()
.collect(Collectors.groupingBy(
Product::getCategory,
Collectors.counting()
));
2. 数据批处理
// 批量处理数据
List<Result> results = dataList.stream()
.map(data -> {
try {
return process(data);
} catch (Exception e) {
return handleError(data, e);
}
})
.collect(Collectors.toList());
六、性能对比与建议
- 小数据集(<1000):传统循环性能更优
- 中大数据集:Stream API可读性和性能更佳
- 并行流:数据量>1万时效果显著
- 避免装箱:使用IntStream/LongStream等专用流
// 基本类型流优化
IntStream.rangeClosed(1, 100)
.filter(n -> n % 2 == 0)
.average(); // 避免Integer装箱开销