java 8 stream factory methods - vanderbilt universityschmidt/cs891f/2018-pdfs/12-java... ·...

37
Java 8 Stream Factory Methods Douglas C. Schmidt [email protected] www.dre.vanderbilt.edu/~schmidt Professor of Computer Science Institute for Software Integrated Systems Vanderbilt University Nashville, Tennessee, USA

Upload: others

Post on 06-Aug-2020

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Java 8 Stream Factory Methods - Vanderbilt Universityschmidt/cs891f/2018-PDFs/12-Java... · 2018-10-01 · Stream stream = Arrays.stream(a); stream.forEach(s -> System.out.println(s));

Java 8 Stream Factory Methods

Douglas C. [email protected]

www.dre.vanderbilt.edu/~schmidt

Professor of Computer Science

Institute for Software

Integrated Systems

Vanderbilt University

Nashville, Tennessee, USA

Page 2: Java 8 Stream Factory Methods - Vanderbilt Universityschmidt/cs891f/2018-PDFs/12-Java... · 2018-10-01 · Stream stream = Arrays.stream(a); stream.forEach(s -> System.out.println(s));

2

Learning Objectives in this Lesson• Recognize common stream factory methods

Page 3: Java 8 Stream Factory Methods - Vanderbilt Universityschmidt/cs891f/2018-PDFs/12-Java... · 2018-10-01 · Stream stream = Arrays.stream(a); stream.forEach(s -> System.out.println(s));

3

Common Factory Methods for Creating Streams

Page 4: Java 8 Stream Factory Methods - Vanderbilt Universityschmidt/cs891f/2018-PDFs/12-Java... · 2018-10-01 · Stream stream = Arrays.stream(a); stream.forEach(s -> System.out.println(s));

4See docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html

Common Factory Methods for Creating Streams• Streams can be obtained various ways

Page 5: Java 8 Stream Factory Methods - Vanderbilt Universityschmidt/cs891f/2018-PDFs/12-Java... · 2018-10-01 · Stream stream = Arrays.stream(a); stream.forEach(s -> System.out.println(s));

5

• Streams can be obtained various ways, e.g.,

• From a Java collection

or

Common Factory Methods for Creating Streams

List<String> wordsToFind =

Arrays.asList("do", "re", "me", ...);

List<SearchResults> results =

wordsToFind.stream()

...

List<SearchResults> results =

wordsToFind.parallelStream()

...

Page 6: Java 8 Stream Factory Methods - Vanderbilt Universityschmidt/cs891f/2018-PDFs/12-Java... · 2018-10-01 · Stream stream = Arrays.stream(a); stream.forEach(s -> System.out.println(s));

6

• Streams can be obtained various ways, e.g.,

• From a Java collection

See docs.oracle.com/javase/tutorial/collections/streams

Common Factory Methods for Creating Streams

List<String> wordsToFind =

Arrays.asList("do", "re", "me", ...);

List<SearchResults> results =

wordsToFind.stream()

...

Page 7: Java 8 Stream Factory Methods - Vanderbilt Universityschmidt/cs891f/2018-PDFs/12-Java... · 2018-10-01 · Stream stream = Arrays.stream(a); stream.forEach(s -> System.out.println(s));

7

• Streams can be obtained various ways, e.g.,

• From a Java collection

See docs.oracle.com/javase/tutorial/collections/streams/parallelism.html

Common Factory Methods for Creating Streams

or

List<String> wordsToFind =

Arrays.asList("do", "re", "me", ...);

List<SearchResults> results =

wordsToFind.stream()

...

List<SearchResults> results =

wordsToFind.parallelStream()

...

Page 8: Java 8 Stream Factory Methods - Vanderbilt Universityschmidt/cs891f/2018-PDFs/12-Java... · 2018-10-01 · Stream stream = Arrays.stream(a); stream.forEach(s -> System.out.println(s));

8

• Streams can be obtained various ways, e.g.,

• From a Java collection

See docs.oracle.com/javase/8/docs/api/java/util/stream/BaseStream.html#parallel

Common Factory Methods for Creating Streams

A call to parallel() can appear anywhere in a

stream & will have same effect as parallelStream()

or

List<String> wordsToFind =

Arrays.asList("do", "re", "me", ...);

List<SearchResults> results =

wordsToFind.stream()

...

List<SearchResults> results =

wordsToFind.stream()

...

.parallel()

Page 9: Java 8 Stream Factory Methods - Vanderbilt Universityschmidt/cs891f/2018-PDFs/12-Java... · 2018-10-01 · Stream stream = Arrays.stream(a); stream.forEach(s -> System.out.println(s));

9

• Streams can be obtained various ways, e.g.,

• From a Java collection

• From an arrayString[] a = {

"a", "b", "c", "d", "e"

};

Stream<String> stream = Arrays.stream(a);

stream.forEach(s ->

System.out.println(s));

or

stream.forEach(System.out::println);

Common Factory Methods for Creating Streams

Page 10: Java 8 Stream Factory Methods - Vanderbilt Universityschmidt/cs891f/2018-PDFs/12-Java... · 2018-10-01 · Stream stream = Arrays.stream(a); stream.forEach(s -> System.out.println(s));

10

String[] a = {

"a", "b", "c", "d", "e"

};

Stream<String> stream = Arrays.stream(a);

stream.forEach(s ->

System.out.println(s));

or

stream.forEach(System.out::println);

• Streams can be obtained various ways, e.g.,

• From a Java collection

• From an array

Get & print all the elements in an array

Common Factory Methods for Creating Streams

See docs.oracle.com/javase/8/docs/api/java/util/Arrays.html#stream

Page 11: Java 8 Stream Factory Methods - Vanderbilt Universityschmidt/cs891f/2018-PDFs/12-Java... · 2018-10-01 · Stream stream = Arrays.stream(a); stream.forEach(s -> System.out.println(s));

11

String[] a = {

"a", "b", "c", "d", "e"

};

Stream<String> stream = Arrays.stream(a);

stream.forEach(s ->

System.out.println(s));

or

stream.forEach(System.out::println);

• Streams can be obtained various ways, e.g.,

• From a Java collection

• From an array

Get & print all the elements in an array

Common Factory Methods for Creating Streams

Page 12: Java 8 Stream Factory Methods - Vanderbilt Universityschmidt/cs891f/2018-PDFs/12-Java... · 2018-10-01 · Stream stream = Arrays.stream(a); stream.forEach(s -> System.out.println(s));

12

• Streams can be obtained various ways, e.g.,

• From a Java collection

• From an array

• From a static factory method

String[] a = {

"a", "b", "c", "d", "e"

};

Stream<String> stream = Stream.of(a);

stream.forEach(s ->

System.out.println(s));

or

stream.forEach(System.out::println);

Common Factory Methods for Creating Streams

Page 13: Java 8 Stream Factory Methods - Vanderbilt Universityschmidt/cs891f/2018-PDFs/12-Java... · 2018-10-01 · Stream stream = Arrays.stream(a); stream.forEach(s -> System.out.println(s));

13

• Streams can be obtained various ways, e.g.,

• From a Java collection

• From an array

• From a static factory method

String[] a = {

"a", "b", "c", "d", "e"

};

Stream<String> stream = Stream.of(a);

stream.forEach(s ->

System.out.println(s));

or

stream.forEach(System.out::println);

Common Factory Methods for Creating Streams

Get & print all the elements in an array

See docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#of

Page 14: Java 8 Stream Factory Methods - Vanderbilt Universityschmidt/cs891f/2018-PDFs/12-Java... · 2018-10-01 · Stream stream = Arrays.stream(a); stream.forEach(s -> System.out.println(s));

14

• Streams can be obtained various ways, e.g.,

• From a Java collection

• From an array

• From a static factory method

String[] a = {

"a", "b", "c", "d", "e"

};

Stream<String> stream = Stream.of(a);

stream.forEach(s ->

System.out.println(s));

or

stream.forEach(System.out::println);

Common Factory Methods for Creating Streams

Get & print all the elements in an array

Page 15: Java 8 Stream Factory Methods - Vanderbilt Universityschmidt/cs891f/2018-PDFs/12-Java... · 2018-10-01 · Stream stream = Arrays.stream(a); stream.forEach(s -> System.out.println(s));

15

• Streams can be obtained various ways, e.g.,

• From a Java collection

• From an array

• From a static factory method

Stream.iterate(new BigInteger[]{BigInteger.ONE,

BigInteger.ONE},

f -> new BigInteger[]{f[1],

f[0].add(f[1])})

.map(f -> f[0])

.limit(100)

.forEach(System.out::println);

Common Factory Methods for Creating Streams

See docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#iterate

Page 16: Java 8 Stream Factory Methods - Vanderbilt Universityschmidt/cs891f/2018-PDFs/12-Java... · 2018-10-01 · Stream stream = Arrays.stream(a); stream.forEach(s -> System.out.println(s));

16

• Streams can be obtained various ways, e.g.,

• From a Java collection

• From an array

• From a static factory method

Stream.iterate(new BigInteger[]{BigInteger.ONE,

BigInteger.ONE},

f -> new BigInteger[]{f[1],

f[0].add(f[1])})

.map(f -> f[0])

.limit(100)

.forEach(System.out::println);

Generate & print the first 100 Fibonacci #’s

Common Factory Methods for Creating Streams

Page 17: Java 8 Stream Factory Methods - Vanderbilt Universityschmidt/cs891f/2018-PDFs/12-Java... · 2018-10-01 · Stream stream = Arrays.stream(a); stream.forEach(s -> System.out.println(s));

17

• Streams can be obtained various ways, e.g.,

• From a Java collection

• From an array

• From a static factory method

Stream.iterate(new BigInteger[]{BigInteger.ONE,

BigInteger.ONE},

f -> new BigInteger[]{f[1],

f[0].add(f[1])})

.map(f -> f[0])

.limit(100)

.forEach(System.out::println);

Create the “seed,” which defines the initial element in the stream

Common Factory Methods for Creating Streams

Page 18: Java 8 Stream Factory Methods - Vanderbilt Universityschmidt/cs891f/2018-PDFs/12-Java... · 2018-10-01 · Stream stream = Arrays.stream(a); stream.forEach(s -> System.out.println(s));

18

• Streams can be obtained various ways, e.g.,

• From a Java collection

• From an array

• From a static factory method

Stream.iterate(new BigInteger[]{BigInteger.ONE,

BigInteger.ONE},

f -> new BigInteger[]{f[1],

f[0].add(f[1])})

.map(f -> f[0])

.limit(100)

.forEach(System.out::println);

A lambda function applied to the previous element to

produce a new element

Common Factory Methods for Creating Streams

Page 19: Java 8 Stream Factory Methods - Vanderbilt Universityschmidt/cs891f/2018-PDFs/12-Java... · 2018-10-01 · Stream stream = Arrays.stream(a); stream.forEach(s -> System.out.println(s));

19

• Streams can be obtained various ways, e.g.,

• From a Java collection

• From an array

• From a static factory method

Stream.iterate(new BigInteger[]{BigInteger.ONE,

BigInteger.ONE},

f -> new BigInteger[]{f[1],

f[0].add(f[1])})

.map(f -> f[0])

.limit(100)

.forEach(System.out::println);

Convert the array to its first element

Common Factory Methods for Creating Streams

Page 20: Java 8 Stream Factory Methods - Vanderbilt Universityschmidt/cs891f/2018-PDFs/12-Java... · 2018-10-01 · Stream stream = Arrays.stream(a); stream.forEach(s -> System.out.println(s));

20

• Streams can be obtained various ways, e.g.,

• From a Java collection

• From an array

• From a static factory method

Stream.iterate(new BigInteger[]{BigInteger.ONE,

BigInteger.ONE},

f -> new BigInteger[]{f[1],

f[0].add(f[1])})

.map(f -> f[0])

.limit(100)

.forEach(System.out::println);

Common Factory Methods for Creating Streams

See docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#limit

Limit the stream to 100 elements

Page 21: Java 8 Stream Factory Methods - Vanderbilt Universityschmidt/cs891f/2018-PDFs/12-Java... · 2018-10-01 · Stream stream = Arrays.stream(a); stream.forEach(s -> System.out.println(s));

21

• Streams can be obtained various ways, e.g.,

• From a Java collection

• From an array

• From a static factory method

Stream.iterate(new BigInteger[]{BigInteger.ONE,

BigInteger.ONE},

f -> new BigInteger[]{f[1],

f[0].add(f[1])})

.map(f -> f[0])

.limit(100)

.forEach(System.out::println); Print the Fibonacci #’s

Common Factory Methods for Creating Streams

Page 22: Java 8 Stream Factory Methods - Vanderbilt Universityschmidt/cs891f/2018-PDFs/12-Java... · 2018-10-01 · Stream stream = Arrays.stream(a); stream.forEach(s -> System.out.println(s));

22

• Streams can be obtained various ways, e.g.,

• From a Java collection

• From an array

• From a static factory method

Stream.iterate(new BigInteger[]{BigInteger.ONE,

BigInteger.ONE},

f -> new BigInteger[]{f[1],

f[0].add(f[1])})

.parallel()

.map(f -> f[0])

.limit(100)

.forEach(System.out::println);

Common Factory Methods for Creating Streams

See docs.oracle.com/javase/8/docs/api/java/util/stream/IntStream.html#range

Don’t use iterate() in a parallel stream! Use the *Stream.range() method instead..

Page 23: Java 8 Stream Factory Methods - Vanderbilt Universityschmidt/cs891f/2018-PDFs/12-Java... · 2018-10-01 · Stream stream = Arrays.stream(a); stream.forEach(s -> System.out.println(s));

23

• Streams can be obtained various ways, e.g.,

• From a Java collection

• From an array

• From a static factory method

• BufferedReader.lines() obtains lines of a file

void printFileLines

(String filename){

try (BufferedReader reader =

Files.newBufferedReader

(Paths.get(filename)) {

reader

.lines()

.forEach

(System.out::println);

} catch (IOException ex) {...}

}Create a stream containing

all of the lines in a file

Common Factory Methods for Creating Streams

See docs.oracle.com/javase/8/docs/api/java/io/BufferedReader.html#lines

Page 24: Java 8 Stream Factory Methods - Vanderbilt Universityschmidt/cs891f/2018-PDFs/12-Java... · 2018-10-01 · Stream stream = Arrays.stream(a); stream.forEach(s -> System.out.println(s));

24

• Streams can be obtained various ways, e.g.,

• From a Java collection

• From an array

• From a static factory method

• BufferedReader.lines() obtains lines of a file

void printFileLines

(String filename){

try (BufferedReader reader =

Files.newBufferedReader

(Paths.get(filename)) {

reader

.lines()

.forEach

(System.out::println);

} catch (IOException ex) {...}

}Print each of the lines in the stream

Common Factory Methods for Creating Streams

Page 25: Java 8 Stream Factory Methods - Vanderbilt Universityschmidt/cs891f/2018-PDFs/12-Java... · 2018-10-01 · Stream stream = Arrays.stream(a); stream.forEach(s -> System.out.println(s));

25

• Streams can be obtained various ways, e.g.,

• From a Java collection

• From an array

• From a static factory method

• BufferedReader.lines() obtains lines of a file

• Streams of file paths & lines can be obtained from Files methods

void printFileLines

(String filename){

try(Stream<String> stream =

Files.lines

(Paths.get(fileName))) {

stream.forEach

(System.out::println);

} catch (IOException ex) {...}

}

Common Factory Methods for Creating Streams

See docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#lines

Create a stream containing all of the lines in a file

Page 26: Java 8 Stream Factory Methods - Vanderbilt Universityschmidt/cs891f/2018-PDFs/12-Java... · 2018-10-01 · Stream stream = Arrays.stream(a); stream.forEach(s -> System.out.println(s));

26

• Streams can be obtained various ways, e.g.,

• From a Java collection

• From an array

• From a static factory method

• BufferedReader.lines() obtains lines of a file

• Streams of file paths & lines can be obtained from Files methods

void printFileLines

(String filename){

try(Stream<String> stream =

Files.lines

(Paths.get(fileName))) {

stream.forEach

(System.out::println);

} catch (IOException ex) {...}

}

Common Factory Methods for Creating Streams

Print each of the lines in the stream

Page 27: Java 8 Stream Factory Methods - Vanderbilt Universityschmidt/cs891f/2018-PDFs/12-Java... · 2018-10-01 · Stream stream = Arrays.stream(a); stream.forEach(s -> System.out.println(s));

27

• Streams can be obtained various ways, e.g.,

• From a Java collection

• From an array

• From a static factory method

• BufferedReader.lines() obtains lines of a file

• Streams of file paths & lines can be obtained from Files methods

• A stream of random #’s can be obtained from Random.ints()

new Random()

.ints(0,100)

.limit(50)

.forEach(System.out::println);

Common Factory Methods for Creating Streams

Page 28: Java 8 Stream Factory Methods - Vanderbilt Universityschmidt/cs891f/2018-PDFs/12-Java... · 2018-10-01 · Stream stream = Arrays.stream(a); stream.forEach(s -> System.out.println(s));

28

• Streams can be obtained various ways, e.g.,

• From a Java collection

• From an array

• From a static factory method

• BufferedReader.lines() obtains lines of a file

• Streams of file paths & lines can be obtained from Files methods

• A stream of random #’s can be obtained from Random.ints()

new Random()

.ints(0,100)

.limit(50)

.forEach(System.out::println);

Generate an “unbounded” stream of random #’s ranging between 0 & 100

Common Factory Methods for Creating Streams

See docs.oracle.com/javase/8/docs/api/java/util/Random.html#ints

Page 29: Java 8 Stream Factory Methods - Vanderbilt Universityschmidt/cs891f/2018-PDFs/12-Java... · 2018-10-01 · Stream stream = Arrays.stream(a); stream.forEach(s -> System.out.println(s));

29

• Streams can be obtained various ways, e.g.,

• From a Java collection

• From an array

• From a static factory method

• BufferedReader.lines() obtains lines of a file

• Streams of file paths & lines can be obtained from Files methods

• A stream of random #’s can be obtained from Random.ints()

new Random()

.ints(0,100)

.limit(50)

.forEach(System.out::println);

Common Factory Methods for Creating Streams

Limit the size of the stream to 50 elements

Page 30: Java 8 Stream Factory Methods - Vanderbilt Universityschmidt/cs891f/2018-PDFs/12-Java... · 2018-10-01 · Stream stream = Arrays.stream(a); stream.forEach(s -> System.out.println(s));

30

• Streams can be obtained various ways, e.g.,

• From a Java collection

• From an array

• From a static factory method

• BufferedReader.lines() obtains lines of a file

• Streams of file paths & lines can be obtained from Files methods

• A stream of random #’s can be obtained from Random.ints()

new Random()

.ints(0,100)

.limit(50)

.forEach(System.out::println);

Common Factory Methods for Creating Streams

Print each random # in the stream

Page 31: Java 8 Stream Factory Methods - Vanderbilt Universityschmidt/cs891f/2018-PDFs/12-Java... · 2018-10-01 · Stream stream = Arrays.stream(a); stream.forEach(s -> System.out.println(s));

31

• Streams can be obtained various ways, e.g.,

• From a Java collection

• From an array

• From a static factory method

• BufferedReader.lines() obtains lines of a file

• Streams of file paths & lines can be obtained from Files methods

• A stream of random #’s can be obtained from Random.ints()

• Other JDK stream-bearing methods

Stream<String> getInputData

(String filename,

String splitter){

return Pattern

.compile(splitter)

.splitAsStream

(new String

(Files.readAllBytes

(Paths.get(filename)

.toURI())));

}

Common Factory Methods for Creating Streams

Page 32: Java 8 Stream Factory Methods - Vanderbilt Universityschmidt/cs891f/2018-PDFs/12-Java... · 2018-10-01 · Stream stream = Arrays.stream(a); stream.forEach(s -> System.out.println(s));

32

• Streams can be obtained various ways, e.g.,

• From a Java collection

• From an array

• From a static factory method

• BufferedReader.lines() obtains lines of a file

• Streams of file paths & lines can be obtained from Files methods

• A stream of random #’s can be obtained from Random.ints()

• Other JDK stream-bearing methods

Stream<String> getInputData

(String filename,

String splitter){

return Pattern

.compile(splitter)

.splitAsStream

(new String

(Files.readAllBytes

(Paths.get(filename)

.toURI())));

}

Splits a file into a stream of strings

Common Factory Methods for Creating Streams

See docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html#splitAsStream

Page 33: Java 8 Stream Factory Methods - Vanderbilt Universityschmidt/cs891f/2018-PDFs/12-Java... · 2018-10-01 · Stream stream = Arrays.stream(a); stream.forEach(s -> System.out.println(s));

33

• Streams can be obtained various ways, e.g.,

• From a Java collection

• From an array

• From a static factory method

• BufferedReader.lines() obtains lines of a file

• Streams of file paths & lines can be obtained from Files methods

• A stream of random #’s can be obtained from Random.ints()

• Other JDK stream-bearing methods

List<TreeMap<Long, String>>

listOfTreeMaps =

Stream.generate

(TreeMap<Long, String>::new)

.limit(100)

.collect(toList());

Generate an “infinite” stream of TreeMaps

Common Factory Methods for Creating Streams

See docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#generate

Page 34: Java 8 Stream Factory Methods - Vanderbilt Universityschmidt/cs891f/2018-PDFs/12-Java... · 2018-10-01 · Stream stream = Arrays.stream(a); stream.forEach(s -> System.out.println(s));

34

• Streams can be obtained various ways, e.g.,

• From a Java collection

• From an array

• From a static factory method

• BufferedReader.lines() obtains lines of a file

• Streams of file paths & lines can be obtained from Files methods

• A stream of random #’s can be obtained from Random.ints()

• Other JDK stream-bearing methods

List<TreeMap<Long, String>>

listOfTreeMaps =

Stream.generate

(TreeMap<Long, String>::new)

.limit(100)

.collect(toList());

Common Factory Methods for Creating Streams

Limit the stream to 100 elements

Page 35: Java 8 Stream Factory Methods - Vanderbilt Universityschmidt/cs891f/2018-PDFs/12-Java... · 2018-10-01 · Stream stream = Arrays.stream(a); stream.forEach(s -> System.out.println(s));

35

• Streams can be obtained various ways, e.g.,

• From a Java collection

• From an array

• From a static factory method

• BufferedReader.lines() obtains lines of a file

• Streams of file paths & lines can be obtained from Files methods

• A stream of random #’s can be obtained from Random.ints()

• Other JDK stream-bearing methods

List<TreeMap<Long, String>>

listOfTreeMaps =

Stream.generate

(TreeMap<Long, String>::new)

.limit(100)

.collect(toList());

Common Factory Methods for Creating Streams

Create a list of 100 TreeMaps

Page 36: Java 8 Stream Factory Methods - Vanderbilt Universityschmidt/cs891f/2018-PDFs/12-Java... · 2018-10-01 · Stream stream = Arrays.stream(a); stream.forEach(s -> System.out.println(s));

36

• Streams can be obtained various ways, e.g.,

• From a Java collection

• From an array

• From a static factory method

• BufferedReader.lines() obtains lines of a file

• Streams of file paths & lines can be obtained from Files methods

• A stream of random #’s can be obtained from Random.ints()

• Other JDK stream-bearing methods

List<TreeMap<Long, String>>

listOfTreeMaps =

Stream.generate

(TreeMap<Long, String>::new)

.limit(100)

.collect(toList());

Common Factory Methods for Creating Streams

We’ll use this idiom in Java 8 programs covered later

Page 37: Java 8 Stream Factory Methods - Vanderbilt Universityschmidt/cs891f/2018-PDFs/12-Java... · 2018-10-01 · Stream stream = Arrays.stream(a); stream.forEach(s -> System.out.println(s));

37

End of Java 8 Stream Factory Methods