Most visited

Recently visited

Added in API level 24

Stream

public interface Stream
implements BaseStream<T, Stream<T>>

java.util.stream.Stream<T>


一系列支持顺序和并行集合操作的元素。 以下示例说明了使用StreamIntStream的集合操作:

int sum = widgets.stream()
                      .filter(w -> w.getColor() == RED)
                      .mapToInt(w -> w.getWeight())
                      .sum();
 
In this example, widgets is a Collection<Widget>. We create a stream of Widget objects via Collection.stream(), filter it to produce a stream containing only the red widgets, and then transform it into a stream of int values representing the weight of each red widget. Then this stream is summed to produce a total weight.

除了 Stream ,这是对象引用的流,存在原语特为 IntStreamLongStream ,和 DoubleStream ,所有这些都称为“流”和符合此处描述的特征和限制。

为了执行计算,流operations被组成流流水线 一个流管道由一个源(可能是一个数组,一个集合,一个生成器函数,一个I / O通道等),零个或多个中间操作 (将流转换为另一个流,例如filter(Predicate) )和终端操作 (产生结果或副作用,例如count()forEach(Consumer) )。 流是懒惰的; 只有在终端操作启动时才会执行对源数据的计算,并且只根据需要消耗源元素。

收藏和流媒体虽然具有一些肤浅的相似之处,却有不同的目标。 收藏主要关注其元素的有效管理和访问。 相比之下,流不提供直接访问或操作元素的方法,而是关注于声明性地描述它们的来源以及将在该来源上进行的计算操作。 但是,如果提供的流操作不提供所需的功能,则可以使用iterator()spliterator()操作执行受控遍历。

流式管道,就像上面的“小部件”示例一样,可以被视为流源上的查询 除非源代码被明确设计用于并发修改(例如ConcurrentHashMap ),否则在查询流时修改流源可能会导致不可预知或错误的行为。

大多数流操作接受描述用户指定行为的参数,例如上面示例中传递给mapToInt的lambda表达式w -> w.getWeight() 为了保持正确的行为,这些行为参数

这些参数总是functional interface的实例,例如Function ,并且通常是lambda表达式或方法引用。 除非另有说明,否则这些参数必须是非空的

应该只对一个流进行操作(调用中间流或终端流操作)一次。 这排除了例如“分叉”流,其中相同的源馈送两个或更多个管线,或者多个遍历同一个流。 如果流实现可能会抛出IllegalStateException如果它检测到该流正在被重用。 但是,由于某些流操作可能会返回接收者而不是新的流对象,因此可能无法在所有情况下检测到重用。

流有一个close()方法并实现AutoCloseable ,但几乎所有的流实例实际上并不需要在使用后关闭。 一般来说,只有来源是IO通道的流才需要关闭。 大多数流由集合,数组或生成函数支持,不需要特殊的资源管理。 (如果某个流确实需要关闭,则可以在try -with-resources语句try其声明为资源。)

流管道可以按顺序执行或在parallel中执行。 此执行模式是流的属性。 流是通过顺序或并行执行的初始选择创建的。 (例如, Collection.stream()创建顺序流, Collection.parallelStream()创建一个并行流。)执行模式的这种选择可以通过sequential()parallel()方法进行修改,并且可以使用isParallel()方法进行查询。

也可以看看:

Summary

Nested classes

interface Stream.Builder<T>

Stream可变建设者。

Public methods

abstract boolean allMatch(Predicate<? super T> predicate)

返回此流的所有元素是否与提供的谓词匹配。

abstract boolean anyMatch(Predicate<? super T> predicate)

返回此流的任何元素是否与提供的谓词匹配。

static <T> Builder<T> builder()

返回 Stream的构建器。

abstract <R, A> R collect(Collector<? super T, A, R> collector)

使用 Collector对此流的元素执行 mutable reduction操作。

abstract <R> R collect(Supplier<R> supplier, BiConsumer<R, ? super T> accumulator, BiConsumer<R, R> combiner)

对此流的元素执行 mutable reduction操作。

static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b)

创建一个延迟连接的流,其元素是第一个流的所有元素,后跟第二个流的所有元素。

abstract long count()

返回此流中元素的数量。

abstract Stream<T> distinct()

返回由此流的不同元素(根据 equals(Object) )组成的流。

static <T> Stream<T> empty()

返回一个空的顺序 Stream

abstract Stream<T> filter(Predicate<? super T> predicate)

返回包含此流中与给定谓词相匹配的元素的流。

abstract Optional<T> findAny()

返回描述流的某个元素的 Optional ,或者如果流为空,则返回空 Optional

abstract Optional<T> findFirst()

返回 Optional描述此流的第一个元素,或空 Optional如果流是空的。

abstract <R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)

返回一个流,该流包含将此流的每个元素替换为通过将所提供的映射函数应用于每个元素而生成的映射流的内容的结果。

abstract DoubleStream flatMapToDouble(Function<? super T, ? extends DoubleStream> mapper)

返回 DoubleStream其中包含将此流的每个元素替换为通过将所提供的映射函数应用于每个元素而生成的映射流的内容的结果。

abstract IntStream flatMapToInt(Function<? super T, ? extends IntStream> mapper)

返回 IntStream其中包含将此流的每个元素替换为通过将所提供的映射函数应用于每个元素而生成的映射流的内容的结果。

abstract LongStream flatMapToLong(Function<? super T, ? extends LongStream> mapper)

返回 LongStream其中包含将此流的每个元素替换为通过将所提供的映射函数应用于每个元素而生成的映射流的内容的结果。

abstract void forEach(Consumer<? super T> action)

为此流的每个元素执行操作。

abstract void forEachOrdered(Consumer<? super T> action)

为流的每个元素执行操作,如果流具有已定义的遇到顺序,则按流的遇到顺序执行操作。

static <T> Stream<T> generate(Supplier<T> s)

返回一个无限顺序无序流,其中每个元素由提供的 Supplier生成。

static <T> Stream<T> iterate(T seed, UnaryOperator<T> f)

返回有序无限连续 Stream由函数的迭代应用产生 f到初始元素 seed ,产生 Streamseedf(seed)f(f(seed))

abstract Stream<T> limit(long maxSize)

返回由该流的元素组成的流,截断长度不超过 maxSize

abstract <R> Stream<R> map(Function<? super T, ? extends R> mapper)

返回由将给定函数应用于此流的元素的结果组成的流。

abstract DoubleStream mapToDouble(ToDoubleFunction<? super T> mapper)

返回一个 DoubleStream其中包含将给定函数应用于此流的元素的结果。

abstract IntStream mapToInt(ToIntFunction<? super T> mapper)

返回一个 IntStream其中包含将给定函数应用于此流的元素的结果。

abstract LongStream mapToLong(ToLongFunction<? super T> mapper)

返回一个 LongStream其中包含将给定函数应用于此流的元素的结果。

abstract Optional<T> max(Comparator<? super T> comparator)

根据提供的 Comparator返回此流的最大元素。

abstract Optional<T> min(Comparator<? super T> comparator)

根据提供的 Comparator返回此流的最小元素。

abstract boolean noneMatch(Predicate<? super T> predicate)

返回此流的元素是否与提供的谓词匹配。

static <T> Stream<T> of(T t)

返回包含单个元素的顺序 Stream

static <T> Stream<T> of(T... values)

返回顺序排列的流,其元素是指定的值。

abstract Stream<T> peek(Consumer<? super T> action)

返回由该流的元素组成的流,并在元素从结果流中消耗时另外对每个元素执行提供的操作。

abstract T reduce(T identity, BinaryOperator<T> accumulator)

使用提供的标识值和 associative累积函数对此流的元素执行 reduction ,并返回缩小的值。

abstract Optional<T> reduce(BinaryOperator<T> accumulator)

使用 associative累加函数对此流的元素执行 reduction ,并返回描述缩减值的 Optional (如果有)。

abstract <U> U reduce(U identity, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner)

使用提供的标识,累加和组合函数对此流的元素执行 reduction

abstract Stream<T> skip(long n)

在丢弃流的第一个 n元素后,返回由该流的其余元素组成的流。

abstract Stream<T> sorted(Comparator<? super T> comparator)

返回由该流的元素组成的流,按照提供的 Comparator进行排序。

abstract Stream<T> sorted()

返回由该流的元素组成的流,按照自然顺序排序。

abstract Object[] toArray()

返回包含此流的元素的数组。

abstract <A> A[] toArray(IntFunction<A[]> generator)

返回包含此流的元素的数组,使用提供的 generator函数分配返回的数组,以及分区执行或调整大小时可能需要的任何其他数组。

Inherited methods

From interface java.util.stream.BaseStream
From interface java.lang.AutoCloseable

Public methods

allMatch

Added in API level 24
boolean allMatch (Predicate<? super T> predicate)

返回此流的所有元素是否与提供的谓词匹配。 如果不需要确定结果,则不能评估所有元素的谓词。 如果流为空,则返回true ,并且不评估谓词。

这是一个 short-circuiting terminal operation

API Note:
  • This method evaluates the universal quantification of the predicate over the elements of the stream (for all x P(x)). If the stream is empty, the quantification is said to be vacuously satisfied and is always true (regardless of P(x)).
Parameters
predicate Predicate: a non-interfering, stateless predicate to apply to elements of this stream
Returns
boolean true if either all elements of the stream match the provided predicate or the stream is empty, otherwise false

anyMatch

Added in API level 24
boolean anyMatch (Predicate<? super T> predicate)

返回此流的任何元素是否与提供的谓词匹配。 如果不需要确定结果,则不能评估所有元素的谓词。 如果流为空,则返回false ,并且不评估谓词。

这是一个 short-circuiting terminal operation

API Note:
  • This method evaluates the existential quantification of the predicate over the elements of the stream (for some x P(x)).
Parameters
predicate Predicate: a non-interfering, stateless predicate to apply to elements of this stream
Returns
boolean true if any elements of the stream match the provided predicate, otherwise false

builder

Added in API level 24
Builder<T> builder ()

返回 Stream的构建器。

Returns
Builder<T> a stream builder

collect

Added in API level 24
R collect (Collector<? super T, A, R> collector)

使用Collector对此流的元素执行mutable reduction操作。 A Collector将用作参数的函数封装到collect(Supplier, BiConsumer, BiConsumer) ,允许重用收集策略和组合收集操作,如多级分组或分区。

如果数据流是并行的,并且 Collectorconcurrent ,并且数据流是无序的或者收集器是 unordered ,那么会执行并发的还原(有关并发还原的详细信息,请参阅 Collector )。

这是一个 terminal operation

当并行执行时,可以实例化,填充和合并多个中间结果,以保持可变数据结构的隔离。 因此,即使与非线程安全的数据结构(如ArrayList )并行执行,也不需要额外的同步来进行并行减少。

API Note:
  • The following will accumulate strings into an ArrayList:
    List<String> asList = stringStream.collect(Collectors.toList());
     

    以下将按城市分类 Person对象:

    Map<String, List<Person>> peopleByCity
             = personStream.collect(Collectors.groupingBy(Person::getCity));
     

    以下将 Person州和城市对 Person对象进行分类,将两个 Collector级联在一起:

    Map<String, Map<String, List<Person>>> peopleByStateAndCity
             = personStream.collect(Collectors.groupingBy(Person::getState,
                                                          Collectors.groupingBy(Person::getCity)));
     
Parameters
collector Collector: the Collector describing the reduction
Returns
R the result of the reduction

也可以看看:

collect

Added in API level 24
R collect (Supplier<R> supplier, 
                BiConsumer<R, ? super T> accumulator, 
                BiConsumer<R, R> combiner)

对此流的元素执行mutable reduction操作。 可变的约简是减少的值是一个可变的结果容器,例如ArrayList ,并且通过更新结果状态而不是通过替换结果来合并元素。 这产生的结果等同于:

R result = supplier.get();
     for (T element : this stream)
         accumulator.accept(result, element);
     return result;
 

reduce(Object, BinaryOperator)一样, collect操作可以并行化而不需要额外的同步。

这是一个 terminal operation

API Note:
  • There are many existing classes in the JDK whose signatures are well-suited for use with method references as arguments to collect(). For example, the following will accumulate strings into an ArrayList:
    List<String> asList = stringStream.collect(ArrayList::new, ArrayList::add,
                                                    ArrayList::addAll);
     

    以下内容将获取一串字符串并将它们连接成一个字符串:

    String concat = stringStream.collect(StringBuilder::new, StringBuilder::append,
                                              StringBuilder::append)
                                     .toString();
     
Parameters
supplier Supplier: a function that creates a new result container. For a parallel execution, this function may be called multiple times and must return a fresh value each time.
accumulator BiConsumer: an associative, non-interfering, stateless function for incorporating an additional element into a result
combiner BiConsumer: an associative, non-interfering, stateless function for combining two values, which must be compatible with the accumulator function
Returns
R the result of the reduction

concat

Added in API level 24
Stream<T> concat (Stream<? extends T> a, 
                Stream<? extends T> b)

创建一个延迟连接的流,其元素是第一个流的所有元素,后跟第二个流的所有元素。 如果两个输入流都是有序的,则生成的流是有序的,如果任意一个输入流是并行的,则生成流。 当结果流关闭时,调用两个输入流的关闭处理程序。

Implementation Note:
  • Use caution when constructing streams from repeated concatenation. Accessing an element of a deeply concatenated stream can result in deep call chains, or even StackOverflowException.
Parameters
a Stream: the first stream
b Stream: the second stream
Returns
Stream<T> the concatenation of the two input streams

count

Added in API level 24
long count ()

返回此流中元素的数量。 这是reduction的特例 ,相当于:

return mapToLong(e -> 1L).sum();
 

这是一个 terminal operation

Returns
long the count of elements in this stream

distinct

Added in API level 24
Stream<T> distinct ()

返回由此流的不同元素(根据 equals(Object) )组成的流。

对于有序流,选择不同的元素是稳定的(对于重复的元素,保留在遇到顺序中首先出现的元素)。对于无序流,没有稳定性保证。

这是一个 stateful intermediate operation

API Note:
  • Preserving stability for distinct() in parallel pipelines is relatively expensive (requires that the operation act as a full barrier, with substantial buffering overhead), and stability is often not needed. Using an unordered stream source (such as generate(Supplier)) or removing the ordering constraint with unordered() may result in significantly more efficient execution for distinct() in parallel pipelines, if the semantics of your situation permit. If consistency with encounter order is required, and you are experiencing poor performance or memory utilization with distinct() in parallel pipelines, switching to sequential execution with sequential() may improve performance.
Returns
Stream<T> the new stream

empty

Added in API level 24
Stream<T> empty ()

返回一个空的顺序 Stream

Returns
Stream<T> an empty sequential stream

filter

Added in API level 24
Stream<T> filter (Predicate<? super T> predicate)

返回包含此流中与给定谓词相匹配的元素的流。

这是一个 intermediate operation

Parameters
predicate Predicate: a non-interfering, stateless predicate to apply to each element to determine if it should be included
Returns
Stream<T> the new stream

findAny

Added in API level 24
Optional<T> findAny ()

返回描述流的某个元素的 Optional ,或者如果流为空,则返回空 Optional

这是一个 short-circuiting terminal operation

这种操作的行为显然是不确定的; 它可以自由选择流中的任何元素。 这是为了在并行操作中实现最高性能; 成本是在同一个源上的多个调用可能不会返回相同的结果。 (如果需要稳定的结果, findFirst()改为使用findFirst()

Returns
Optional<T> an Optional describing some element of this stream, or an empty Optional if the stream is empty
Throws
NullPointerException if the element selected is null

也可以看看:

findFirst

Added in API level 24
Optional<T> findFirst ()

返回Optional描述此流的第一个元素,或空Optional如果流是空的。 如果该流没有遇到命令,则可以返回任何元素。

这是一个 short-circuiting terminal operation

Returns
Optional<T> an Optional describing the first element of this stream, or an empty Optional if the stream is empty
Throws
NullPointerException if the element selected is null

flatMap

Added in API level 24
Stream<R> flatMap (Function<? super T, ? extends Stream<? extends R>> mapper)

返回一个流,该流包含将此流的每个元素替换为通过将所提供的映射函数应用于每个元素而生成的映射流的内容的结果。 将其内容放入此流后,每个映射流都是closed (如果映射流为null ,则使用空流,而不是。)

这是一个 intermediate operation

API Note:
  • The flatMap() operation has the effect of applying a one-to-many transformation to the elements of the stream, and then flattening the resulting elements into a new stream.

    例子。

    如果 orders是采购订单流,并且每个采购订单都包含一系列行项目,则以下内容会生成包含所有订单中所有行项目的流:

    orders.flatMap(order -> order.getLineItems().stream())...
     

    如果 path是文件的路径,则以下内容会生成包含在该文件中的 words的流:

    Stream<String> lines = Files.lines(path, StandardCharsets.UTF_8);
         Stream<String> words = lines.flatMap(line -> Stream.of(line.split(" +")));
     
    The mapper function passed to flatMap splits a line, using a simple regular expression, into an array of words, and then creates a stream of words from that array.
Parameters
mapper Function: a non-interfering, stateless function to apply to each element which produces a stream of new values
Returns
Stream<R> the new stream

flatMapToDouble

Added in API level 24
DoubleStream flatMapToDouble (Function<? super T, ? extends DoubleStream> mapper)

返回DoubleStream其中包含将此流的每个元素替换为通过将所提供的映射函数应用于每个元素而生成的映射流的内容的结果。 在其内容放入此流后,每个映射流都是closed (如果映射流为null ,则使用空流而不是。)

这是一个 intermediate operation

Parameters
mapper Function: a non-interfering, stateless function to apply to each element which produces a stream of new values
Returns
DoubleStream the new stream

也可以看看:

flatMapToInt

Added in API level 24
IntStream flatMapToInt (Function<? super T, ? extends IntStream> mapper)

返回IntStream其中包含将此流的每个元素替换为通过将提供的映射函数应用于每个元素而生成的映射流的内容的结果。 将其内容放入此流后,每个映射流都是closed (如果映射的流是null ,则使用空流,而不是。)

这是一个 intermediate operation

Parameters
mapper Function: a non-interfering, stateless function to apply to each element which produces a stream of new values
Returns
IntStream the new stream

也可以看看:

flatMapToLong

Added in API level 24
LongStream flatMapToLong (Function<? super T, ? extends LongStream> mapper)

返回一个LongStream其中包含将此流的每个元素替换为通过将提供的映射函数应用于每个元素而生成的映射流的内容的结果。 将其内容放入此流后,每个映射流都是closed (如果映射流为null ,则使用空流而不是)。

这是一个 intermediate operation

Parameters
mapper Function: a non-interfering, stateless function to apply to each element which produces a stream of new values
Returns
LongStream the new stream

也可以看看:

forEach

Added in API level 24
void forEach (Consumer<? super T> action)

为此流的每个元素执行操作。

这是一个 terminal operation

这个操作的行为显然是不确定的。 对于并行流管道,此操作并不保证尊重流的相遇顺序,因为这样做会牺牲并行的利益。 对于任何给定的元素,该动作可以在任何时间和库中选择的任何线程中执行。 如果操作访问共享状态,它负责提供所需的同步。

Parameters
action Consumer: a non-interfering action to perform on the elements

forEachOrdered

Added in API level 24
void forEachOrdered (Consumer<? super T> action)

为流的每个元素执行操作,如果流具有已定义的遇到顺序,则按流的遇到顺序执行操作。

这是一个 terminal operation

该操作一次处理一个元素,如果存在,则按照相遇顺序处理。 执行一个元素的动作happens-before为后续元素执行动作,但对于任何给定的元素,该动作可以在库选择的任何线程中执行。

Parameters
action Consumer: a non-interfering action to perform on the elements

也可以看看:

generate

Added in API level 24
Stream<T> generate (Supplier<T> s)

返回一个无限顺序无序流,其中每个元素由提供的Supplier生成。 这适用于生成恒定流,随机元素流等。

Parameters
s Supplier: the Supplier of generated elements
Returns
Stream<T> a new infinite sequential unordered Stream

iterate

Added in API level 24
Stream<T> iterate (T seed, 
                UnaryOperator<T> f)

返回有序无限连续 Stream由函数的迭代应用产生 f到初始元素 seed ,产生 Streamseedf(seed)f(f(seed))

第一元件(位置0在) Stream将是提供seed 对于n > 0 ,位置n处的元素将是将函数f应用于位置n - 1上的元素的n - 1

Parameters
seed T: the initial element
f UnaryOperator: a function to be applied to to the previous element to produce a new element
Returns
Stream<T> a new sequential Stream

limit

Added in API level 24
Stream<T> limit (long maxSize)

返回由此流的元素组成的流,截断长度不超过 maxSize

这是一个 short-circuiting stateful intermediate operation

API Note:
  • While limit() is generally a cheap operation on sequential stream pipelines, it can be quite expensive on ordered parallel pipelines, especially for large values of maxSize, since limit(n) is constrained to return not just any n elements, but the first n elements in the encounter order. Using an unordered stream source (such as generate(Supplier)) or removing the ordering constraint with unordered() may result in significant speedups of limit() in parallel pipelines, if the semantics of your situation permit. If consistency with encounter order is required, and you are experiencing poor performance or memory utilization with limit() in parallel pipelines, switching to sequential execution with sequential() may improve performance.
Parameters
maxSize long: the number of elements the stream should be limited to
Returns
Stream<T> the new stream
Throws
IllegalArgumentException if maxSize is negative

map

Added in API level 24
Stream<R> map (Function<? super T, ? extends R> mapper)

返回由将给定函数应用于此流的元素的结果组成的流。

这是一个 intermediate operation

Parameters
mapper Function: a non-interfering, stateless function to apply to each element
Returns
Stream<R> the new stream

mapToDouble

Added in API level 24
DoubleStream mapToDouble (ToDoubleFunction<? super T> mapper)

返回一个 DoubleStream其中包含将给定函数应用于此流的元素的结果。

这是一个 intermediate operation

Parameters
mapper ToDoubleFunction: a non-interfering, stateless function to apply to each element
Returns
DoubleStream the new stream

mapToInt

Added in API level 24
IntStream mapToInt (ToIntFunction<? super T> mapper)

返回一个 IntStream其中包含将给定函数应用于此流的元素的结果。

这是一个 intermediate operation

Parameters
mapper ToIntFunction: a non-interfering, stateless function to apply to each element
Returns
IntStream the new stream

mapToLong

Added in API level 24
LongStream mapToLong (ToLongFunction<? super T> mapper)

返回一个 LongStream其中包含将给定函数应用于此流的元素的结果。

这是一个 intermediate operation

Parameters
mapper ToLongFunction: a non-interfering, stateless function to apply to each element
Returns
LongStream the new stream

max

Added in API level 24
Optional<T> max (Comparator<? super T> comparator)

根据提供的Comparator返回此流的最大元素。 这是一个reduction的特例

这是一个 terminal operation

Parameters
comparator Comparator: a non-interfering, stateless Comparator to compare elements of this stream
Returns
Optional<T> an Optional describing the maximum element of this stream, or an empty Optional if the stream is empty
Throws
NullPointerException if the maximum element is null

min

Added in API level 24
Optional<T> min (Comparator<? super T> comparator)

根据提供的Comparator返回此流的最小元素。 这是一个reduction的特例

这是一个 terminal operation

Parameters
comparator Comparator: a non-interfering, stateless Comparator to compare elements of this stream
Returns
Optional<T> an Optional describing the minimum element of this stream, or an empty Optional if the stream is empty
Throws
NullPointerException if the minimum element is null

noneMatch

Added in API level 24
boolean noneMatch (Predicate<? super T> predicate)

返回此流的元素是否与提供的谓词匹配。 如果不需要确定结果,则不能评估所有元素的谓词。 如果流为空,则返回true ,并且不评估谓词。

这是一个 short-circuiting terminal operation

API Note:
  • This method evaluates the universal quantification of the negated predicate over the elements of the stream (for all x ~P(x)). If the stream is empty, the quantification is said to be vacuously satisfied and is always true, regardless of P(x).
Parameters
predicate Predicate: a non-interfering, stateless predicate to apply to elements of this stream
Returns
boolean true if either no elements of the stream match the provided predicate or the stream is empty, otherwise false

of

Added in API level 24
Stream<T> of (T t)

返回包含单个元素的顺序 Stream

Parameters
t T: the single element
Returns
Stream<T> a singleton sequential stream

of

Added in API level 24
Stream<T> of (T... values)

返回顺序排列的流,其元素是指定的值。

Parameters
values T: the elements of the new stream
Returns
Stream<T> the new stream

peek

Added in API level 24
Stream<T> peek (Consumer<? super T> action)

返回由该流的元素组成的流,并在元素从结果流中消耗时另外对每个元素执行提供的操作。

这是一个 intermediate operation

对于并行流管线,可以随时调用该操作,并且可以在任何线程中通过上游操作使该元素可用。 如果该操作修改共享状态,则它负责提供所需的同步。

API Note:
  • This method exists mainly to support debugging, where you want to see the elements as they flow past a certain point in a pipeline:
    Stream.of("one", "two", "three", "four")
             .filter(e -> e.length() > 3)
             .peek(e -> System.out.println("Filtered value: " + e))
             .map(String::toUpperCase)
             .peek(e -> System.out.println("Mapped value: " + e))
             .collect(Collectors.toList());
     
Parameters
action Consumer: a non-interfering action to perform on the elements as they are consumed from the stream
Returns
Stream<T> the new stream

reduce

Added in API level 24
T reduce (T identity, 
                BinaryOperator<T> accumulator)

对此流的元素执行reduction ,使用提供的标识值和associative累加函数,并返回缩小的值。 这相当于:

T result = identity;
     for (T element : this stream)
         result = accumulator.apply(result, element)
     return result;
 
but is not constrained to execute sequentially.

identity值必须是累加器函数的标识。 这意味着,对于所有taccumulator.apply(identity, t)等于t accumulator函数必须是associative函数。

这是一个 terminal operation

API Note:
  • Sum, min, max, average, and string concatenation are all special cases of reduction. Summing a stream of numbers can be expressed as:
    Integer sum = integers.reduce(0, (a, b) -> a+b);
     
    or:
    Integer sum = integers.reduce(0, Integer::sum);
     

    虽然与简单地在循环中改变运行总数相比,这看起来可能是一种更为迂回的方式来执行聚合,但减少操作可以更加平滑地进行并行处理,而不需要额外的同步并大大降低了数据竞争的风险。

Parameters
identity T: the identity value for the accumulating function
accumulator BinaryOperator: an associative, non-interfering, stateless function for combining two values
Returns
T the result of the reduction

reduce

Added in API level 24
Optional<T> reduce (BinaryOperator<T> accumulator)

对此流的元素执行reduction ,使用associative累加函数,并返回描述减小值的Optional (如果有)。 这相当于:

boolean foundAny = false;
     T result = null;
     for (T element : this stream) {
         if (!foundAny) {
             foundAny = true;
             result = element;
         }
         else
             result = accumulator.apply(result, element);
     }
     return foundAny ? Optional.of(result) : Optional.empty();
 
but is not constrained to execute sequentially.

accumulator函数必须是 associative函数。

这是一个 terminal operation

Parameters
accumulator BinaryOperator: an associative, non-interfering, stateless function for combining two values
Returns
Optional<T> an Optional describing the result of the reduction
Throws
NullPointerException if the result of the reduction is null

也可以看看:

reduce

Added in API level 24
U reduce (U identity, 
                BiFunction<U, ? super T, U> accumulator, 
                BinaryOperator<U> combiner)

使用提供的标识,累加和组合函数,对此流的元素执行reduction 这相当于:

U result = identity;
     for (T element : this stream)
         result = accumulator.apply(result, element)
     return result;
 
but is not constrained to execute sequentially.

identity值必须是组合函数的标识。 这意味着,对于所有ucombiner(identity, u)等于u 另外, combiner功能必须与accumulator功能兼容; 对于所有的ut ,以下都必须具备:

combiner.apply(u, accumulator.apply(identity, t)) == accumulator.apply(u, t)
 

这是一个 terminal operation

API Note:
  • Many reductions using this form can be represented more simply by an explicit combination of map and reduce operations. The accumulator function acts as a fused mapper and accumulator, which can sometimes be more efficient than separate mapping and reduction, such as when knowing the previously reduced value allows you to avoid some computation.
Parameters
identity U: the identity value for the combiner function
accumulator BiFunction: an associative, non-interfering, stateless function for incorporating an additional element into a result
combiner BinaryOperator: an associative, non-interfering, stateless function for combining two values, which must be compatible with the accumulator function
Returns
U the result of the reduction

也可以看看:

skip

Added in API level 24
Stream<T> skip (long n)

在丢弃流的第一个n元素后,返回由该流的其余元素组成的流。 如果此流包含少于n元素,则会返回一个空流。

这是一个 stateful intermediate operation

API Note:
  • While skip() is generally a cheap operation on sequential stream pipelines, it can be quite expensive on ordered parallel pipelines, especially for large values of n, since skip(n) is constrained to skip not just any n elements, but the first n elements in the encounter order. Using an unordered stream source (such as generate(Supplier)) or removing the ordering constraint with unordered() may result in significant speedups of skip() in parallel pipelines, if the semantics of your situation permit. If consistency with encounter order is required, and you are experiencing poor performance or memory utilization with skip() in parallel pipelines, switching to sequential execution with sequential() may improve performance.
Parameters
n long: the number of leading elements to skip
Returns
Stream<T> the new stream
Throws
IllegalArgumentException if n is negative

sorted

Added in API level 24
Stream<T> sorted (Comparator<? super T> comparator)

返回由该流的元素组成的流,按照提供的 Comparator进行排序。

对于有序流,排序是稳定的。 对于无序的流,没有稳定性保证。

这是一个 stateful intermediate operation

Parameters
comparator Comparator: a non-interfering, stateless Comparator to be used to compare stream elements
Returns
Stream<T> the new stream

sorted

Added in API level 24
Stream<T> sorted ()

返回由该流的元素组成的流,按照自然顺序排序。 如果此流的元素不是Comparable ,则在执行终端操作时可能会抛出java.lang.ClassCastException

对于有序流,排序是稳定的。 对于无序的流,没有稳定性保证。

这是一个 stateful intermediate operation

Returns
Stream<T> the new stream

toArray

Added in API level 24
Object[] toArray ()

返回包含此流的元素的数组。

这是一个 terminal operation

Returns
Object[] an array containing the elements of this stream

toArray

Added in API level 24
A[] toArray (IntFunction<A[]> generator)

返回包含此流的元素的数组,使用提供的 generator函数分配返回的数组以及分区执行或调整大小时可能需要的任何其他数组。

这是一个 terminal operation

API Note:
  • The generator function takes an integer, which is the size of the desired array, and produces an array of the desired size. This can be concisely expressed with an array constructor reference:
    Person[] men = people.stream()
                              .filter(p -> p.getGender() == MALE)
                              .toArray(Person[]::new);
     
Parameters
generator IntFunction: a function which produces a new array of the desired type and the provided length
Returns
A[] an array containing the elements in this stream
Throws
ArrayStoreException if the runtime type of the array returned from the array generator is not a supertype of the runtime type of every element in this stream

Hooray!