Stream Operations OverviewJ8 Home « Stream Operations Overview

We have seen several examples of intermediate stream operations such as filter() and terminal stream operations like count() in the first two lessons. In this lesson we look at all of the intermediate and terminal stream operations available. We will see coding examples of individual operations, both intermediate and terminal, in subsequent lessons.

Intermediate Operations Top

Once a stream is created from a source we use intermediate operations to process the stream such as filtering the stream using the filter() method which we used in the Introducing Streams lesson. A stream pipeline doesn't have to have any intermediate stream operations, such as just using the count() terminal operation on its own, but this rarely makes any sense from a coding perspective. What generally happens is one or more intermediate operations transform the stream pipeline until the terminal operation processes it.

The following table lists all the intermediate stream operations available:

Intermediate Stream Operations
Operation Return Type Type or Functional Interface Description Code Examples
distinct()
stateful-unbounded
Stream<T>Returns a stream of unique elements.Numeric Streams
filter()Stream<T>Predicate<T>Returns a stream of unique elements.Introducing Streams
Stream Pipelines
Finding & Matching
flatMap()Stream<R>Function<T, Stream<R>>Returns a stream consisting of the results of replacing each element of this stream with the contents of a mapped stream produced by applying the provided mapping function to each element.Other Stream Creation
limit()
stateful-bounded
Stream<T>longReturns a stream consisting of the elements of this stream, truncated to be no longer than maxSize in length.Stream Pipelines
map()Stream<R>Function<T, R>Returns a stream consisting of the results of applying the given function to the elements of this stream.Array Type Streams
Finding & Matching
Reduction Operations
skip()
stateful-bounded
Stream<T>longReturns a stream consisting of the remaining elements of this stream after discarding the first n elements of the stream.Stream Pipelines
peek()Stream<T>Consumer<T>Returns a stream consisting of the elements of this stream, additionally performing the provided action on each element as elements are consumed from the resulting stream.Stream Pipelines
sorted()
stateful-unbounded
Stream<T>Comparator<T>Returns a stream consisting of the elements of this stream, sorted according to natural order or provided Comparator<T>.Stream Collectors

Stateful and Stateless Operations Top

You may have noticed the stateful-bounded and stateful-unbounded entries in the Operation column. Intermediate stream operations can generally be considered as stateless e.g. the filter() intermediate operator takes a value from the incoming stream and puts zero or one results into the outgoing stream, it doesn't need to know or retain any state, so this sort of operation can be thought of as stateless.

The distinct(), limit(), skip() and sorted() intermediate stream operations are stateful as they need to keep internal state to perform their tasks.

In the case of the limit() and skip() intermediate stream operations the state required is small as information of how many records to skip or limit the stream too can be held within a long and so are bounded by this.

The distinct() and sorted() intermediate stream operations on the other hand need to know what happened to the stream previously to fulfill their tasks. This can lead to issues when dealing with large and infinite stre

Terminal Operations Top

There are quite a few terminal stream operations and you will use some a lot more than others. The following table lists all the terminal stream operations available:

Terminal Stream Operations
Operation Return Type Type or Functional Interface Description Code Examples
allMatch()booleanPredicate<T>Returns whether all elements of this stream match the provided predicate.Finding & Matching
anyMatch()booleanPredicate<T>Returns whether any elements of this stream match the provided predicate.Finding & Matching
collect()RCollector<T, A, R>Performs a mutable reduction operation on the elements of this stream using a Collector.Numeric Streams
Reduction Operations
count()longReturns the count of elements in this stream.Introducing Streams
Stream Pipelines
Array Type Streams
Other Stream Creation
Reduction Operations
findAny()Optional<T>Returns an Optional describing some element of the stream, or an empty Optional if the stream is empty.Finding & Matching
findFirst()Optional<T>Returns an Optional describing the first element of this stream, or an empty Optional if the stream is empty.Finding & Matching
forEach()voidConsumer<T>Performs an action for each element of this stream.Stream Pipelines
Array Type Streams
min()Optional<T>Comparator<T>Returns the minimum element of this stream according to the provided Comparator.Reduction Operations
max()Optional<T>Comparator<T>Returns the maximum element of this stream according to the provided Comparator.Reduction Operations
noneMatch()booleanPredicate<T>Returns whether no elements of this stream match the provided predicate.Finding & Matching
reduce()Optional<T>BinaryOperator<T>Performs a reduction on the elements of this stream, using an associative accumulation function, and returns an Optional describing the reduced value, if any.Numeric Streams
Reduction Operations
toArray()Object[]Returns an array containing the elements of this stream..Numeric Streams

Intermediate and Terminal Operation Differences Top

Now we have seen all the intermediate and terminal stream operations lets look at the differences between them.

  • There can be zero or more intermediate operations but there must be one and only one terminal operation.
  • Intermediate operations are lazily loaded and only executed after the terminal operation is eagerly loaded.
  • The internal iteration of a stream is begun by the terminal operation not any intermediate operations.
  • Intermediate operations produce a stream whereas a terminal operation produces a result.

Related Quiz

Streams Quiz 3 - Streams Operations Overview Quiz

Lesson 3 Complete

In this lesson we took a high level overview of stream operations including tables listing all the intermediate and terminal operations.

What's Next?

In the next lesson we look at creating streams from arrays.