Java Stream流式编程概述
·
Java Stream流式编程概述
Java Stream是Java 8引入的API,用于以声明式方式处理集合数据。它支持链式操作(如过滤、映射、归约),能够简化集合操作并提升代码可读性。Stream不存储数据,而是通过管道(Pipeline)对源数据(如集合、数组)进行高效批量处理。
核心特点
- 惰性求值:多数操作(如
filter、map)只有触发终止操作(如collect、forEach)时才会执行。 - 并行能力:通过
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()尽早终止处理,减少计算量。 - 原始类型流:使用
IntStream、LongStream避免装箱开销。
示例:统计单词频率
Map<String, Long> wordCount = lines.stream()
.flatMap(line -> Arrays.stream(line.split(" ")))
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
此代码将文本行拆分为单词并统计每个单词的出现次数。
通过掌握Stream API,开发者能以更简洁的代码实现复杂的数据处理逻辑,同时兼顾性能与可维护性。
更多推荐
所有评论(0)