Documentation ¶
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Sink ¶
type Sink interface { consumer.Consumer /** * Resets the sink state to receive a fresh data set. This must be called * before sending any data to the sink. After calling {@link #end()}, * you may call this method to reset the sink for another calculation. * @param size The exact size of the data to be pushed Downstream, if * known or {@code -1} if unknown or infinite. * * <p>Prior to this call, the sink must be in the initial state, and after * this call it is in the active state. */ Begin(size int) /** * Indicates that all elements have been pushed. If the {@code Sink} is * stateful, it should send any stored state Downstream at this time, and * should clear any accumulated state (and associated resources). * * <p>Prior to this call, the sink must be in the active state, and after * this call it is returned to the initial state. */ End() /** * Indicates that this {@code Sink} does not wish to receive any more data. * * @implSpec The default implementation always returns false. * * @return true if cancellation is requested */ CancellationRequested() bool }
*
- An extension of {@link Consumer} used to conduct values through the stages of
- a stream pipeline, with additional methods to manage size information,
- control flow, etc. Before calling the {@code accept()} method on a
- {@code Sink} for the first time, you must first call the {@code begin()}
- method to inform it that data is coming (optionally informing the sink how
- much data is coming), and after all data has been sent, you must call the
- {@code end()} method. After calling {@code end()}, you should not call
- {@code accept()} without again calling {@code begin()}. {@code Sink} also
- offers a mechanism by which the sink can cooperatively signal that it does
- not wish to receive any more data (the {@code cancellationRequested()}
- method), which a source can poll before sending more data to the
- {@code Sink}. *
- <p>A sink may be in one of two states: an initial state and an active state.
- It starts out in the initial state; the {@code begin()} method transitions
- it to the active state, and the {@code end()} method transitions it back into
- the initial state, where it can be re-used. Data-accepting methods (such as
- {@code accept()} are only valid in the active state. *
- @apiNote
- A stream pipeline consists of a source, zero or more intermediate stages
- (such as filtering or mapping), and a terminal stage, such as reduction or
- for-each. For concreteness, consider the pipeline: *
- <pre>{@code
- int longestStringLengthStartingWithA
- = strings.stream()
- .filter(s -> s.startsWith("A"))
- .mapToInt(String::length)
- .max();
- }</pre> *
- <p>Here, we have three stages, filtering, mapping, and reducing. The
- filtering stage consumes strings and emits a subset of those strings; the
- mapping stage consumes strings and emits ints; the reduction stage consumes
- those ints and computes the maximal value. *
- <p>A {@code Sink} instance is used to represent each stage of this pipeline,
- whether the stage accepts objects, ints, longs, or doubles. Sink has entry
- points for {@code accept(Object)}, {@code accept(int)}, etc, so that we do
- not need a specialized interface for each primitive specialization. (It
- might be called a "kitchen sink" for this omnivorous tendency.) The entry
- point to the pipeline is the {@code Sink} for the filtering stage, which
- sends some elements "Downstream" -- into the {@code Sink} for the mapping
- stage, which in turn sends integral values Downstream into the {@code Sink}
- for the reduction stage. The {@code Sink} implementations associated with a
- given stage is expected to know the data type for the next stage, and call
- the correct {@code accept} method on its Downstream {@code Sink}. Similarly,
- each stage must implement the correct {@code accept} method corresponding to
- the data type it accepts. *
- <p>The specialized subtypes such as {@link Sink.OfInt} override
- {@code accept(Object)} to call the appropriate primitive specialization of
- {@code accept}, implement the appropriate primitive specialization of
- {@code Consumer}, and re-abstract the appropriate primitive specialization of
- {@code accept}. *
- <p>The chaining subtypes such as {@link ChainedInt} not only implement
- {@code Sink.OfInt}, but also maintain a {@code Downstream} field which
- represents the Downstream {@code Sink}, and implement the methods
- {@code begin()}, {@code end()}, and {@code cancellationRequested()} to
- delegate to the Downstream {@code Sink}. Most implementations of
- intermediate operations will use these chaining wrappers. For example, the
- mapping stage in the above example would look like: *
- <pre>{@code
- IntSink is = new Sink.AbstractChainedReferenceSink<U>(sink) {
- public void accept(U u) {
- Downstream.accept(mapper.applyAsInt(u));
- }
- };
- }</pre> *
- <p>Here, we implement {@code Sink.AbstractChainedReferenceSink<U>}, meaning that we expect
- to receive elements of type {@code U} as input, and pass the Downstream sink
- to the constructor. Because the next stage expects to receive integers, we
- must call the {@code accept(int)} method when emitting values to the Downstream.
- The {@code accept()} method applies the mapping function from {@code U} to
- {@code int} and passes the resulting value to the Downstream {@code Sink}. *
- @param <T> type of elements for value streams
- @since 1.8
Click to show internal directories.
Click to hide internal directories.