Streams Java

10713 words streamjavajava

This concept was added to Java 8. Support functional-style operations on streams of elements, such as map-reduce transformations on collections.

What is Stream?
Stream is an immutable flow of elements, you could compare the way the streams process content to a loop.

Package java.util.stream;

Stream operations are divided into intermediate and terminal operations. A stream source can be a Collection, an array, a generator function.

Intermediate operations

The intermediate operations are lazy operations and return a new stream. Some examples at continuous:

- anyMatch()
- distinct()
- filter()
- findFirst()
- flatmap()
- map()
- skip()
- sorted()
- peek()
- limit()

Terminal operations

The terminal operations terminate the stream source pipeline after performing the operations.

- count()
- max()
- min()
- reduce()
- summaryStatistics()
- forEach()
- forEachOrdered()
- sum()
- toArray()
- collect()
- anyMatch
- allMatch()
- noneMatch()
- findAny()
- findFirst()

We can create stream via the stream() and parallelStream() methods and from an array via Arrays.stream(Object[]) method.

Interface Description
BaseStream> Base interface for streams, which are sequences of elements supporting sequential and parallel aggregate operations.
Collector 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.
DoubleStream A sequence of primitive double-valued elements supporting sequential and parallel aggregate operations.
DoubleStream.Builder A mutable builder for a DoubleStream.
IntStream A sequence of primitive int-valued elements supporting sequential and parallel aggregate operations.
IntStream.Builder A mutable builder for an IntStream.
LongStream A sequence of primitive long-valued elements supporting sequential and parallel aggregate operations.
LongStream.Builder A mutable builder for a LongStream.
Stream A sequence of elements supporting sequential and parallel aggregate operations.
Stream.Builder A mutable builder for a Stream.

We can use these classes to collect the intermediate data and manipulate the stream.

Class Description
Collectors
Implementations of Collector that implement various useful reduction operations, such as accumulating elements into collections, summarizing elements according to various criteria, etc.
StreamSupport Low-level utility methods for creating and manipulating streams.

Example

IntStream
    .range(1, 10)
    .forEach(System.out::print);
System.out.println();

[1,2,3,4,5,6,7,8,9]

Intermediate

Stream.of(18, 22, 5, 7, 14, 17, 33)
        .filter(x -> x > 18)
        .forEach(System.out::print);

[22,33]

Terminal

    System.out.println("Min: " + IntStream.of(18, 22, 5, 7, 14, 17, 33).min());
    System.out.println("Max: " + IntStream.of(18, 22, 5, 7, 14, 17, 33).max());
    System.out.println("Count, Size, or Length: " + IntStream.of(18, 22, 5, 7, 14, 17, 33).count());
    System.out.println("Sum: " + IntStream.of(18, 22, 5, 7, 14, 17, 33).sum());

[Min: OptionalInt[5]]
[Max: OptionalInt[33]]
[Count, Size, or Length: 7]
[Sum: 116]

Stream.of(18, 22, 5, 7, 14, 17, 33, 5, 22)
    .collect(Collectors.toSet())
    .forEach(System.out::println);

[17,33,18,5,22,7,14,2]