Most visited

Recently visited

Added in API level 24

Collector

public interface Collector

java.util.stream.Collector<T, A, R>


A mutable reduction operation that accumulates input elements into a mutable result container, optionally transforming the accumulated result into a final representation after all input elements have been processed. Reduction operations can be performed either sequentially or in parallel.

Examples of mutable reduction operations include: accumulating elements into a Collection; concatenating strings using a StringBuilder; computing summary information about elements such as sum, min, max, or average; computing "pivot table" summaries such as "maximum valued transaction by seller", etc. The class Collectors provides implementations of many common mutable reductions.

A Collector is specified by four functions that work together to accumulate entries into a mutable result container, and optionally perform a final transform on the result. They are:

Collectors also have a set of characteristics, such as CONCURRENT, that provide hints that can be used by a reduction implementation to provide better performance.

A sequential implementation of a reduction using a collector would create a single result container using the supplier function, and invoke the accumulator function once for each input element. A parallel implementation would partition the input, create a result container for each partition, accumulate the contents of each partition into a subresult for that partition, and then use the combiner function to merge the subresults into a combined result.

To ensure that sequential and parallel executions produce equivalent results, the collector functions must satisfy an identity and an associativity constraints.

The identity constraint says that for any partially accumulated result, combining it with an empty result container must produce an equivalent result. That is, for a partially accumulated result a that is the result of any series of accumulator and combiner invocations, a must be equivalent to combiner.apply(a, supplier.get()).

The associativity constraint says that splitting the computation must produce an equivalent result. That is, for any input elements t1 and t2, the results r1 and r2 in the computation below must be equivalent:

A a1 = supplier.get();
     accumulator.accept(a1, t1);
     accumulator.accept(a1, t2);
     R r1 = finisher.apply(a1);  // result without splitting

     A a2 = supplier.get();
     accumulator.accept(a2, t1);
     A a3 = supplier.get();
     accumulator.accept(a3, t2);
     R r2 = finisher.apply(combiner.apply(a2, a3));  // result with splitting
  

For collectors that do not have the UNORDERED characteristic, two accumulated results a1 and a2 are equivalent if finisher.apply(a1).equals(finisher.apply(a2)). For unordered collectors, equivalence is relaxed to allow for non-equality related to differences in order. (For example, an unordered collector that accumulated elements to a List would consider two lists equivalent if they contained the same elements, ignoring order.)

Libraries that implement reduction based on Collector, such as collect(Collector), must adhere to the following constraints:

In addition to the predefined implementations in Collectors, the static factory methods of(Supplier, BiConsumer, BinaryOperator, Characteristics) can be used to construct collectors. For example, you could create a collector that accumulates widgets into a TreeSet with:

Collector<Widget, ?, TreeSet<Widget>> intoSet =
         Collector.of(TreeSet::new, TreeSet::add,
                      (left, right) -> { left.addAll(right); return left; });
 
(This behavior is also implemented by the predefined collector toCollection(Supplier)).

See also:

Summary

Nested classes

enum Collector.Characteristics

Characteristics indicating properties of a Collector, which can be used to optimize reduction implementations. 

Public methods

abstract BiConsumer<A, T> accumulator()

A function that folds a value into a mutable result container.

abstract Set<Collector.Characteristics> characteristics()

Returns a Set of Collector.Characteristics indicating the characteristics of this Collector.

abstract BinaryOperator<A> combiner()

A function that accepts two partial results and merges them.

abstract Function<A, R> finisher()

Perform the final transformation from the intermediate accumulation type A to the final result type R.

static <T, A, R> Collector<T, A, R> of(Supplier<A> supplier, BiConsumer<A, T> accumulator, BinaryOperator<A> combiner, Function<A, R> finisher, Characteristics... characteristics)

Returns a new Collector described by the given supplier, accumulator, combiner, and finisher functions.

static <T, R> Collector<T, R, R> of(Supplier<R> supplier, BiConsumer<R, T> accumulator, BinaryOperator<R> combiner, Characteristics... characteristics)

Returns a new Collector described by the given supplier, accumulator, and combiner functions.

abstract Supplier<A> supplier()

A function that creates and returns a new mutable result container.

Public methods

accumulator

Added in API level 24
BiConsumer<A, T> accumulator ()

A function that folds a value into a mutable result container.

Returns
BiConsumer<A, T> a function which folds a value into a mutable result container

characteristics

Added in API level 24
Set<Collector.Characteristics> characteristics ()

Returns a Set of Collector.Characteristics indicating the characteristics of this Collector. This set should be immutable.

Returns
Set<Collector.Characteristics> an immutable set of collector characteristics

combiner

Added in API level 24
BinaryOperator<A> combiner ()

A function that accepts two partial results and merges them. The combiner function may fold state from one argument into the other and return that, or may return a new result container.

Returns
BinaryOperator<A> a function which combines two partial results into a combined result

finisher

Added in API level 24
Function<A, R> finisher ()

Perform the final transformation from the intermediate accumulation type A to the final result type R.

If the characteristic IDENTITY_TRANSFORM is set, this function may be presumed to be an identity transform with an unchecked cast from A to R.

Returns
Function<A, R> a function which transforms the intermediate result to the final result

of

Added in API level 24
Collector<T, A, R> of (Supplier<A> supplier, 
                BiConsumer<A, T> accumulator, 
                BinaryOperator<A> combiner, 
                Function<A, R> finisher, 
                Characteristics... characteristics)

Returns a new Collector described by the given supplier, accumulator, combiner, and finisher functions.

Parameters
supplier Supplier: The supplier function for the new collector
accumulator BiConsumer: The accumulator function for the new collector
combiner BinaryOperator: The combiner function for the new collector
finisher Function: The finisher function for the new collector
characteristics Characteristics: The collector characteristics for the new collector
Returns
Collector<T, A, R> the new Collector
Throws
NullPointerException if any argument is null

of

Added in API level 24
Collector<T, R, R> of (Supplier<R> supplier, 
                BiConsumer<R, T> accumulator, 
                BinaryOperator<R> combiner, 
                Characteristics... characteristics)

Returns a new Collector described by the given supplier, accumulator, and combiner functions. The resulting Collector has the Collector.Characteristics.IDENTITY_FINISH characteristic.

Parameters
supplier Supplier: The supplier function for the new collector
accumulator BiConsumer: The accumulator function for the new collector
combiner BinaryOperator: The combiner function for the new collector
characteristics Characteristics: The collector characteristics for the new collector
Returns
Collector<T, R, R> the new Collector
Throws
NullPointerException if any argument is null

supplier

Added in API level 24
Supplier<A> supplier ()

A function that creates and returns a new mutable result container.

Returns
Supplier<A> a function which returns a new, mutable result container

Hooray!