Java 中创建流的 10 种方法

2025年1月6日 | 阅读7分钟

可以使用 Stream API 来处理对象集合,Stream API 于 Java 8 首次发布。Stream 是一个可以以多种方式流水线处理以获得不同结果的项的集合。

Java Stream 的特点是

  • Stream 不是数据结构,而是通过数组、集合或 I/O 通道接收输入的替代方法。
  • Stream 仅提供流水线操作的结果,而不会修改底层数据结构。
  • 可以流水线处理不同的中间操作,因为它们都是惰性执行的,并且会产生 Stream。Stream 末尾的终端操作会标记结果并返回它。

创建 Stream 的不同方法

方法:使用 Collections

算法

步骤 1:获取集合

步骤 2:使用 Collection.stream() 函数从集合创建顺序 Stream。

步骤 3:打印 Stream

实施

文件名:SequentialStream.java

输出

Hello Welcome to the World!

方法:从指定值创建 Stream

可以使用 t 值通过 Stream.of(T…t) 方法构建 Stream,其中 t 是元素。此方法的结果是一个包含 t 元素的顺序 Stream。

实施

文件名:StreamSpecifiedValues.java

输出

11 22 33 44 55 66 77 88 99

方法:使用 Arrays.stream() 创建 Stream

可以使用 Stream.of() 和 Arrays.stream() 方法从指定的数组创建顺序 Stream,这些方法通常会一起使用。当使用非原始类型 T 调用这些方法中的任何一个时,都会返回一个 Stream。

实施

文件名:ArrayStream.java

输出

Hello Welcome to World!

方法:使用 Stream.of() 创建 Stream

这是一个非干扰操作,它会返回一个新的 Stream,同时也会对从 Stream 中获取的组件进行处理。

实施

文件名:StreamOFCreation.java

输出

Hello Welcome to World!

方法:使用 Stream.builder() 创建 Stream

build() 方法将生成 Stream 的实例;否则,当需要在语句的正确部分显式给出所需类型时,将使用 builder() 方法。

实施

文件名:StreamStringBuilder.java

输出

Hello Welcome to the World!

方法:使用 Stream.iterate() 创建无限 Stream

iterate() 方法返回一个无限的顺序有序 Stream,它是通过将函数 f 重复应用于种子元素来创建的。iterate 方法的第一个参数是下面示例中结果 Stream 的第一个元素。为了创建每个后续元素,函数会应用于前一个元素。

实施

文件名:IterateStream.java

输出

3
9
81
6561
43046721
-501334399
2038349057

方法:使用 Stream.generate() 方法创建无限 Stream

生成的 Stream 是无限的,并且可以通过 generate() 方法生成,该方法以给定输入为参数。因此,要限制它,可以给出所需的大小,或者让 generate() 方法一直运行直到达到内存限制。

实施

文件名:GenerateStream.java

输出

0.8285302774864066
0.6259903293195835
0.28498534663189434
0.06681813318465979
0.6526779164446666
0.36696884550384856

方法:使用 Predicate 从 Pattern 创建 Stream

Java 8 通过 Pattern 的 asPredicate() 方法创建了一个布尔值谓词函数,并用于模式匹配。

实施

文件名:StreampatternPredicate.java

输出

to
the

方法:从 Iterator 创建 Stream

Collection Framework 使用 Java Iterator 一次获取一个元素。顺序 Stream 只能借助 splitterator 创建。因此,在此技术中也使用了 Spliterator。然而,在这种情况下,使用从 Iterator 创建的 Iterable 作为 Spliterator 的源。因此,首先使用 Iterator 来构建 Iterable。接下来,将 Spliterator 直接作为 Iterable.spliterator() 传递给 stream() 方法。

实施

文件名:IteratorStream.java

输出

Hello Welcome to World!

方法:从 Iterable 创建 Stream

由于 Iterable 接口没有自己的 stream() 方法,因此它们是为此而设计的。所需要做的就是将其传递给 StreamSupport.stream() 函数以从提供的 Iterable 对象获取 Stream。将 Iterable 转换为 Stream 更简单。可以使用 Iterable 的默认方法 Spliterator() 来获取 Spliterator 的实例,然后将其转换为 Stream。

注意:Iterable 不是 Collection 的实例;相反,当它需要从 Spliterator 获取顺序 Stream 时,此方法会内部调用 Collection.stream() 方法。否则,它会调用 StreamSupport.stream()。

实施

文件名:IterableStream.java

输出

Hello Welcome to World!