Skip to content

Stream API

Java Stream API 是Java 8引入的一个核心特性,它为处理集合数据提供了新的思维方式和工具集。Stream API 支持函数式编程风格,允许以声明式的方式处理数据,使代码更加简洁、高效且易于理解。 使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。下面详细介绍Stream API的主要知识点:

Stream 概念

  • 流(Stream):不是集合数据结构,而是一种数据处理的高级抽象,它代表了数据源的计算操作序列。
  • 数据源:可以是集合(如List、Set)、数组、输入/输出通道或是生成器函数等。
  • 中间操作:不会执行任何处理,而是在流的生命周期中构建一个执行计划,如filter、map、sorted等,它们是延迟执行的。
  • 终端操作:触发实际计算,执行中间操作链,并产生结果或副作用,如forEach、collect、reduce、anyMatch等,执行后流无法再被使用。

Stream API

stream

创建Stream

  • 从集合创建:
    • Collection.stream() 顺序流
    • Collection.parallelStream()并行流
  • 数组创建:Arrays.stream(array)
  • 静态工厂方法:
    • IntStream.of(int... values)
    • Stream.of(T... values)
    • Stream.iterate(seed, f)
    • Stream.generate(supplier)

中间操作

  • filter(Predicate):根据条件过滤元素。
  • map(Function):对每个元素应用函数,转换元素类型。
  • flatMap(Function):与map相似,但应用于一对多映射,扁平化结果。
  • distinct():去除重复元素。
  • sorted(Comparator):排序,自然排序或自定义比较器排序。
  • peek(Consumer):对每个元素应用操作并传递下去,主要用于调试。
  • limit(long):限制流中的元素数量。
  • skip(long):跳过流中的前n个元素。

终端操作

  • forEach(Consumer):对每个元素执行操作。
  • toArray():将流转换为数组。
  • reduce(T, BinaryOperator):通过二元操作累积流的元素,如求和、求积等。
  • collect(Collector):归约操作,如收集到List、Set、Map等。
  • min(Comparator):找到最小值。
  • max(Comparator):找到最大值。
  • count():统计流中元素的数量。
  • anyMatch(Predicate)allMatch(Predicate)noneMatch(Predicate):检查是否满足条件。
  • findFirst()findAny():找到第一个或任意一个元素。

并行处理

  • Stream API 支持并行处理,通过parallelStream()方法或中间操作.parallel()开启,可以自动利用多核CPU,提升性能。

短路操作

  • 一些终端操作如findFirst()anyMatch()等,一旦找到满足条件的元素就会立即停止处理,称为短路操作。

函数式接口与Lambda表达式

  • Stream API 使用函数式接口(如Predicate、Function、Consumer等)和Lambda表达式来定义操作逻辑,使得代码更简洁。

状态与无状态操作

  • 无状态操作:操作的结果仅依赖于当前元素,如map。
  • 状态操作:操作可能依赖于之前处理过的元素,如sorted。

错误处理

  • Stream API 在处理过程中遇到错误会抛出异常,如NullPointerException。可以通过try-with-resources或自定义Collector等方式处理异常。

性能考量

  • 虽然Stream API 提供了简洁的编程模型,但不当使用可能影响性能,如过度的中间操作、不必要的并行处理等。

Released under the MIT License.