Gatherers

public final class Gatherers
extends Object

java.lang.Object
   ↳ java.util.stream.Gatherers


Implementations of Gatherer that provide useful intermediate operations, such as windowing functions, folding functions, transforming elements concurrently, etc.

Summary

Public methods

static <T, R> Gatherer<T, ?, R> fold(Supplier<R> initial, BiFunction<? super R, ? super T, ? extends R> folder)

Returns a Gatherer that performs an ordered, reduction-like, transformation for scenarios where no combiner-function can be implemented, or for reductions which are intrinsically order-dependent.

static <T, R> Gatherer<T, ?, R> scan(Supplier<R> initial, BiFunction<? super R, ? super T, ? extends R> scanner)

Returns a Gatherer that performs a Prefix Scan -- an incremental accumulation -- using the provided functions.

static <TR> Gatherer<TR, ?, List<TR>> windowFixed(int windowSize)

Returns a Gatherer that gathers elements into windows -- encounter-ordered groups of elements -- of a fixed size.

static <TR> Gatherer<TR, ?, List<TR>> windowSliding(int windowSize)

Returns a Gatherer that gathers elements into windows -- encounter-ordered groups of elements -- of a given size, where each subsequent window includes all elements of the previous window except for the least recent, and adds the next element in the stream.

Inherited methods

Public methods

fold

public static Gatherer<T, ?, R> fold (Supplier<R> initial, 
                BiFunction<? super R, ? super T, ? extends R> folder)

Returns a Gatherer that performs an ordered, reduction-like, transformation for scenarios where no combiner-function can be implemented, or for reductions which are intrinsically order-dependent.

Implementation Requirements:
  • If no exceptions are thrown during processing, then this operation only ever produces a single element.

    Example: lang=java : // will contain: Optional["123456789"] Optional<String> numberString = Stream.of(1,2,3,4,5,6,7,8,9) .gather( Gatherers.fold(() -> "", (string, number) -> string + number) ) .findFirst();

Parameters
initial Supplier: the identity value for the fold operation

folder BiFunction: the folding function

Returns
Gatherer<T, ?, R> a new Gatherer

Throws
NullPointerException if any of the parameters are null

scan

public static Gatherer<T, ?, R> scan (Supplier<R> initial, 
                BiFunction<? super R, ? super T, ? extends R> scanner)

Returns a Gatherer that performs a Prefix Scan -- an incremental accumulation -- using the provided functions. Starting with an initial value obtained from the Supplier, each subsequent value is obtained by applying the BiFunction to the current value and the next input element, after which the resulting value is produced downstream.

Example: lang=java : // will contain: ["1", "12", "123", "1234", "12345", "123456", "1234567", "12345678", "123456789"] List<String> numberStrings = Stream.of(1,2,3,4,5,6,7,8,9) .gather( Gatherers.scan(() -> "", (string, number) -> string + number) ) .toList();

Parameters
initial Supplier: the supplier of the initial value for the scanner

scanner BiFunction: the function to apply for each element

Returns
Gatherer<T, ?, R> a new Gatherer which performs a prefix scan

Throws
NullPointerException if any of the parameters are null

windowFixed

public static Gatherer<TR, ?, List<TR>> windowFixed (int windowSize)

Returns a Gatherer that gathers elements into windows -- encounter-ordered groups of elements -- of a fixed size. If the stream is empty then no window will be produced. The last window may contain fewer elements than the supplied window size.

Example: lang=java : // will contain: [[1, 2, 3], [4, 5, 6], [7, 8]] List<List<Integer>> windows = Stream.of(1,2,3,4,5,6,7,8).gather(Gatherers.windowFixed(3)).toList();

Implementation Requirements:
  • Each window produced is an unmodifiable List; calls to any mutator method will always cause UnsupportedOperationException to be thrown. There are no guarantees on the implementation type or serializability of the produced Lists.
API Note:
  • For efficiency reasons, windows may be allocated contiguously and eagerly. This means that choosing large window sizes for small streams may use excessive memory for the duration of evaluation of this operation.
Parameters
windowSize int: the size of the windows

Returns
Gatherer<TR, ?, List<TR>> a new gatherer which groups elements into fixed-size windows

Throws
IllegalArgumentException when windowSize is less than 1

windowSliding

public static Gatherer<TR, ?, List<TR>> windowSliding (int windowSize)

Returns a Gatherer that gathers elements into windows -- encounter-ordered groups of elements -- of a given size, where each subsequent window includes all elements of the previous window except for the least recent, and adds the next element in the stream. If the stream is empty then no window will be produced. If the size of the stream is smaller than the window size then only one window will be produced, containing all elements in the stream.

Example: lang=java : // will contain: [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7], [7, 8]] List<List<Integer>> windows2 = Stream.of(1,2,3,4,5,6,7,8).gather(Gatherers.windowSliding(2)).toList(); // will contain: [[1, 2, 3, 4, 5, 6], [2, 3, 4, 5, 6, 7], [3, 4, 5, 6, 7, 8]] List<List<Integer>> windows6 = Stream.of(1,2,3,4,5,6,7,8).gather(Gatherers.windowSliding(6)).toList();

Implementation Requirements:
  • Each window produced is an unmodifiable List; calls to any mutator method will always cause UnsupportedOperationException to be thrown. There are no guarantees on the implementation type or serializability of the produced Lists.
API Note:
  • For efficiency reasons, windows may be allocated contiguously and eagerly. This means that choosing large window sizes for small streams may use excessive memory for the duration of evaluation of this operation.
Parameters
windowSize int: the size of the windows

Returns
Gatherer<TR, ?, List<TR>> a new gatherer which groups elements into sliding windows

Throws
IllegalArgumentException when windowSize is less than 1