Transcript
Page 1: Java 8 Stream API (Valdas Zigas)

Stream APIValdas Žigas · [email protected] · www.kaunas-jug.lt

{ λ }Java 8

Page 2: Java 8 Stream API (Valdas Zigas)

Valdas Žigas

● 13.6 x JAVA

● KTU Programų inžinerija

● SCJP 1.5, PL/SQL OCA

● Oracle University Delivery Instructor

● LKSoft, BPI, Infor, Affecto. PSE, uTrack

Page 3: Java 8 Stream API (Valdas Zigas)

Presentation Source Codehttps://github.com/valdasz/kaunasjug3streamapi.git

Page 4: Java 8 Stream API (Valdas Zigas)

Java 8 { λ }. Impression

List<Long> idList = new ArrayList<>();

...

idList.stream().distinct().map(EmployeeStreamMain::

findById).filter(e -> e != null).filter(e -> e.getSalary() >

40000).findFirst().orElse(null);

Page 5: Java 8 Stream API (Valdas Zigas)

Java 8 { λ }. Impression

12 Years Without Lambdas ...

Page 6: Java 8 Stream API (Valdas Zigas)

java.util.stream.Stream<T> A sequence of elements supporting sequential

and parallel bulk operations

public interface Stream<T> extends BaseStream<T,

Stream<T>>

public interface BaseStream<T, S extends BaseStream<T,

S>> extends AutoCloseable

Page 7: Java 8 Stream API (Valdas Zigas)

java.util.stream.BaseStream<T>

Page 8: Java 8 Stream API (Valdas Zigas)

Simple example. forEachList<String> pronouns = Arrays.asList("i", "you", "he", "she", "it", "we", "you", "they");

pronouns.stream().forEach(p ->

System.out.println(p));

StreamFromListSimpleForEach.java

Page 9: Java 8 Stream API (Valdas Zigas)

Simple example. forEach. Old schoolList<String> pronouns = Arrays.asList("i", "you", "he", "she", "it", "we", "you",

"they");

pronouns.stream().forEach(new Consumer<String>() {

public void accept(String p) {

System.out.println(p);

}

});

StreamFromListSimpleForEachOldStyle.java

Page 10: Java 8 Stream API (Valdas Zigas)

Simple example. filterList<String> pronouns = Arrays.asList("i", "you", "he", "she", "it", "we", "you",

"they");

pronouns.stream().distinct().filter(p -> p.length() == 3).forEach(p ->

System.out.println(p));

StreamFromListSimpleFilter.java

Page 11: Java 8 Stream API (Valdas Zigas)

Simple example. filter. Old schoolpronouns.stream().distinct().filter(new Predicate<String>() {

public boolean test(String p) {

return p.length() == 3;

}

}).forEach(new Consumer<String>() {

public void accept(String p) {

System.out.println(p);

}}); StreamFromListSimpleFilterOldStyle.java

Page 12: Java 8 Stream API (Valdas Zigas)

● Collection.stream(),

Collection.parallelStream()

● Arrays.stream(T[])

● Stream.of(T...)

● IntStream.range(int, int)

● Stream.iterate(T,

UnaryOperator<T>)

Creating streams

Page 13: Java 8 Stream API (Valdas Zigas)

Creating streams. Arrays.streamArrays.stream(new String[] { "This", "is", "Java8", "Stream" })

.forEach(System.out::println);

Arrays.stream(new Integer[] { 1, 2, 3 }).forEach(System.out::println);

Arrays.stream(new int[] { 1, 2, 3 }).forEach(System.out::println);

StreamFromArraysStream.java

Page 14: Java 8 Stream API (Valdas Zigas)

Creating streams. Stream.ofStream.of("This", "is", "Java8", "Stream").forEach(System.out::println);

Stream.of(new Integer[] { 1, 2, 3 }).forEach(System.out::println);

Stream.of(new int[] { 1, 2, 3 }).forEach(System.out::println);

StreamFromStreamOf.java

Page 15: Java 8 Stream API (Valdas Zigas)

Creating streams. IntStreamIntStream.of(new int[] { 1, 2, 3 }).forEach(System.out::println);

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

IntStream.rangeClosed(1, 3).forEach(System.out::println);

IntStreamFromIntStream.java

Page 16: Java 8 Stream API (Valdas Zigas)

Creating streams. Infinite. Iteratestatic <T> Stream<T> iterate(T seed, UnaryOperator<T> f)

IntStream.iterate(1, p -> p + 2).limit(10).forEach(System.out::

println);

StreamFromStreamInfiniteIterate.java

Page 17: Java 8 Stream API (Valdas Zigas)

Creating streams. Infinite. Generatestatic <T> Stream<T> generate(Supplier<T> s)

IntStream.generate(() -> (int) (System.nanoTime() % 100)).

limit(10)

.forEach(System.out::println);

StreamFromStreamInfiniteGenerate.java

Page 18: Java 8 Stream API (Valdas Zigas)

Creating streams● BufferedReader.lines

● Random.ints()

● File.list

● Pattern.splitAsStream

● JarFile.stream()

● ……….. StreamFromBufferedReader.java

StreamFromPatternSplitAsStream.java

Page 19: Java 8 Stream API (Valdas Zigas)

Stream features

● No Storage

● Functional in nature

● Laziness-seeking

● Possibly unbounded

● ConsumableStreamFunctional.java

StreamLaziness.javaStreamConsumable.java

Page 20: Java 8 Stream API (Valdas Zigas)

Stream Operators

● Intermediate (filter, map, limit, sorted ..)

● Terminal (forEach, reduce, findFirst, sum,

collect..)

● Short-circuiting (intermediate/terminal: limit ..

/findFirst..)

Page 21: Java 8 Stream API (Valdas Zigas)

Stream Operators. Intermediatemap (mapToInt, flatMap, ..), filter, distinct, sorted, peek, limit, substream, parallel,

sequential, unordered ..

● Return new Stream

● Always lazy

● Stateless/statefulfilter,map/distinct,sorted

● Some short-circuiting (limit)

Page 22: Java 8 Stream API (Valdas Zigas)

Stream Operators. TerminalforEach, forEachOrdered, toArray, reduce, collect,

min, max, count, findFirst...

● Consumes pipeline/terminates

● Eager (except iterator,

spliterator)

● some short-circuiting (findFirst,

findAny)

Page 23: Java 8 Stream API (Valdas Zigas)

Parallel Streams

● Collection.parallelStream()

BaseStream.parallel()

● same results as stream() apart

nondeterministic ops (findAny)

ParallelStreamFromListSimpleForEach.javaParallelStreamLaziness.java

Page 24: Java 8 Stream API (Valdas Zigas)

Parallel Streams. Non-interference

seq: terminal op starts -> do not update

source -> terminal op ends.List<String> l = new ArrayList<String>(Arrays.asList("kaunas-jug", "meeting"));

Stream<String> sl = l.parallelStream();

l.add("#3");

String s = sl.collect(Collectors.joining(" "));

System.out.println(s);

NonInterference.java

Page 25: Java 8 Stream API (Valdas Zigas)

Parallel Streams. Stateless behaviours

Best approach: avoid stateful behaviourSet<Integer> seen = Collections.synchronizedSet(new HashSet<>());

List<Integer> numbers = Arrays.asList(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3);

List<Integer> result = numbers.parallelStream().map(e -> {return seen.add(e) ? 0 : e;

}).collect(Collectors.toList());

StatefulBehaviour.java

Page 26: Java 8 Stream API (Valdas Zigas)

Parallel Streams. reduce. Associativity

(a op b) op c == a op (b op c)

a op b op c op d == (a op b) op (c op d)

IntStream stream = IntStream.rangeClosed(1, 4).

parallel();

OptionalInt rez = stream.reduce((x, y) -> x - y)ReduceAssociativity.java

Page 27: Java 8 Stream API (Valdas Zigas)

System.exit(0)

Thank You !


Top Related