Java Stream流式编程概述

Java Stream是Java 8引入的API,用于以声明式方式处理集合数据。它支持链式操作(如过滤、映射、归约),能够简化集合操作并提升代码可读性。Stream不存储数据,而是通过管道(Pipeline)对源数据(如集合、数组)进行高效批量处理。

核心特点

  • 惰性求值:多数操作(如filtermap)只有触发终止操作(如collectforEach)时才会执行。
  • 并行能力:通过parallel()方法可自动并行化处理,无需手动管理线程。
  • 不可复用:Stream一旦被消费,无法重复使用,需重新创建。

常用操作分类

中间操作(Intermediate Operations)
  • 过滤filter(Predicate<T>)
    保留满足条件的元素,例如筛选偶数:
    List<Integer> evenNumbers = numbers.stream()
                                      .filter(n -> n % 2 == 0)
                                      .collect(Collectors.toList());
    

  • 映射map(Function<T, R>)
    将元素转换为另一种形式,例如提取对象属性:
    List<String> names = people.stream()
                               .map(Person::getName)
                               .collect(Collectors.toList());
    

终止操作(Terminal Operations)
  • 收集结果collect(Collector)
    常用Collectors.toList()Collectors.toSet()或自定义收集器。
  • 遍历forEach(Consumer<T>)
    对每个元素执行操作,例如打印:
    stream.forEach(System.out::println);
    

并行流优化

通过parallelStream()stream().parallel()启用并行处理,适用于大数据集:

List<String> result = largeList.parallelStream()
                               .filter(s -> s.length() > 3)
                               .collect(Collectors.toList());

注意:并行流需确保操作无状态且线程安全,避免共享可变变量。

性能实践建议

  • 避免重复创建流:多次操作同一数据源时,复用原始集合而非重复调用stream()
  • 短路操作优先:如limit()findFirst()尽早终止处理,减少计算量。
  • 原始类型流:使用IntStreamLongStream避免装箱开销。

示例:统计单词频率

Map<String, Long> wordCount = lines.stream()
    .flatMap(line -> Arrays.stream(line.split(" ")))
    .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

此代码将文本行拆分为单词并统计每个单词的出现次数。

通过掌握Stream API,开发者能以更简洁的代码实现复杂的数据处理逻辑,同时兼顾性能与可维护性。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐