Krzysztof Chruściel
Diebold-Nixdorf
http://downloadclipart.org/do-upload/clipart/2016-08/Cookie_funny_clipart.png
Decorator -------------->
Packing -------------->
Quality -------------->
Decorator -------------->
Packing -------------->
Quality -------------->
internal iterator pattern
Source
Intermediate operations - pipeline
Terminal operation - return value or side effect
Stream.of(cookies)
.filter(Decorator::isDecorated)
.filter(Packer::isPacked)
.filter(QualityAssurance::isQualityFulfilled)
.collect(toList())
Factories: Stream.of(), IntStream.range()
Collections: Collection.stream(), Collection.parallelStream()
Arrays: Arrays.stream()
Random: Random.ints()
Files: Files.walk()
more...
stateful vs stateless
filter-map-reduce
filter(Predicate<? super T> predicate)
map(Function<? super T,? extends R> mapper)
reduce(T identity, BinaryOperator<T> accumulator)
more...
Performance
Collectors.toList()
Collectors.toMap(key, value)
Stream.findFirst()
more...
Creation - source
Configuration - pipeline
Execution - terminal
Cleanup - used once
1930s
1960s
In most programming languages
Finally in Java
List<Integer> results = new ArrayList<>();
IntStream.range(0, 150)
.parallel()
.filter(s -> s % 2 == 0)
.forEach(s -> results.add(s));
System.out.println(results);
List<Cookie> cookies = ...
.filter((Cookie cookie) -> cookie.getSize() > 5)
.filter(cookie -> cookie.getSize() > 5)
Fully statically typed
Effectively Final
int factory = 10;
IntStream.range(1, 5)
.forEach(number -> this.log(number * factory));
int factory = 10;
IntStream.range(1, 5)
.forEach(number -> this.log(number * factory++));
variable should be final or effectively final
Is an Interface
Must have only one abstract method
Compiler check for @
Static methods
Default methods
As always, it depends...
Not a magic bullet
Java 8
Stream.iterate("", s -> s + "s")
.filter(s->s.length() < 10)
.forEach(this::log);
Java 9
Stream.iterate("", s -> s + "s")
.takeWhile(s->s.length() < 10)
.forEach(this::log);
Java 8
Stream.iterate(0, i -> i + 1)
.limit(10);
.forEach(this::log);
Java 9
Stream.iterate(0, i -> i < 10, i -> i + 1)
.forEach(this::log);
Java 8
collection.stream()
.flatMap(element -> {
Integer temp = map.get(element);
return temp != null ? Stream.of(temp) : Stream.empty();
})
.collect(toList());
Java 9
collection.stream()
.flatMap(elements -> Stream.ofNullable(map.get(element)))
.collect(toList());
Venkat Subramaniam
Krzysztof Chruściel
codecouple.pl
krzysztof.chrusciel@outlook.com
github.com/kchrusciel/sjug-streams