Java Stream 操作详解:从基础到实战

Java Stream(流)是 Java 8 引入的核心特性,基于函数式编程思想,为集合数据处理提供了简洁、高效的链式操作。Stream 不存储数据,也不修改源集合,而是通过一系列中间操作(惰性求值)和终止操作(触发执行),实现对数据的过滤、转换、聚合等处理。本文将全面解析 Stream 的核心概念、操作方法及最佳实践。

Stream 核心概念

什么是 Stream?

Stream 是 “数据流” 的抽象,可将集合(如 ListSet)转换为流,通过链式操作对元素进行处理。其核心特点:

  • 不存储数据:流只是数据的 “视图”,操作不会改变源集合。
  • 惰性求值:中间操作仅描述处理逻辑,不实际执行,直到终止操作被调用才一次性执行。
  • 一次性使用:流只能被消费一次,执行终止操作后即失效,再次使用需重新创建。

Stream 操作流程

Stream 处理分为三个阶段,形成 “流水线”:

数据源(集合、数组等)→ 中间操作(过滤、转换等)→ 终止操作(聚合、收集等)
  • 数据源:可是 Collection(通过 stream()parallelStream())、数组(Arrays.stream())、生成器(Stream.generate())等。
  • 中间操作:对数据进行处理(如筛选、排序),返回新的流,可链式调用。
  • 终止操作:触发流的执行,返回非流结果(如集合、数值、布尔值等)。

Stream 的创建(生成流)

从集合创建

所有 Collection 接口的实现类(如 ListSet)均可通过 stream()parallelStream() 生成流:

List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream(); // 顺序流(单线程处理)
Stream<String> parallelStream = list.parallelStream(); // 并行流(多线程处理)

从数组创建

通过 Arrays.stream() 从数组生成流:

阅读全文 »