Java Stream API 高级用法与性能调优

Alex Chen | 2026-09-01T08:56:40 | Java

探索 Stream API 的 Collector 自定义、并行流陷阱、Spliterator 原理,以及在大数据量场景下的性能优化技巧。

# Java Stream API 高级用法与性能调优 ## 自定义 Collector 标准 Collector 不能满足所有需求,我们可以通过 `Collector.of()` 创建自定义收集器。 ```java // 将列表按奇偶分组并统计 Collector> oddEvenCounter = Collector.of( () -> new int[2], // supplier (acc, val) -> acc[val % 2 == 0 ? 0 : 1]++, // accumulator (a, b) -> { a[0] += b[0]; a[1] += b[1]; return a; }, // combiner acc -> Map.of("even", acc[0], "odd", acc[1]), // finisher Collector.Characteristics.UNORDERED ); Map result = IntStream.rangeClosed(1, 100) .boxed() .collect(oddEvenCounter); // {even=50, odd=50} ``` ## 并行流的陷阱 ```java // 错误示例:共享可变状态 List unsafe = new ArrayList(); IntStream.rangeClosed(1, 10000) .parallel() .forEach(unsafe::add); // ConcurrentModificationException! // 正确做法:使用线程安全的收集 List safe = IntStream.rangeClosed(1, 10000) .parallel() .boxed() .collect(Collectors.toList()); ``` ## 何时使用并行流 并行流并非总是更快。适合使用的场景: - 数据量大(> 10000 个元素) - 每个元素的处理开销较大 - 数据源支持高效分割(ArrayList, 数组) - 无共享可变状态 ```java // 基准测试示例 long start = System.nanoTime(); List results = orders.parallelStream() .filter(o -> o.getStatus() == OrderStatus.COMPLETED) .map(o -> calculateTax(o)) // CPU密集型操作 .collect(Collectors.toList()); long elapsed = System.nanoTime() - start; System.out.println("Elapsed: " + elapsed / 1_000_000 + "ms"); ``` ## flatMap 与 Optional 链式调用 ```java Optional city = Optional.ofNullable(user) .flatMap(User::getAddress) .flatMap(Address::getCity) .map(String::toUpperCase) .or(() -> Optional.of("UNKNOWN")); ``` Stream 的 `flatMap` 非常适合一对多展开场景,在处理嵌套集合时能显著简化代码。

← Back to Blog