Download - Sailing with Java 8 Streams
![Page 2: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/2.jpg)
Java
876…
I am evolving…
![Page 3: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/3.jpg)
Java 8: Latest (red-hot)
![Page 4: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/4.jpg)
Recent addition: lambdas
8
![Page 5: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/5.jpg)
Greek characters are scary!
![Page 6: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/6.jpg)
He he, but lambdas are fun, not scary
![Page 7: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/7.jpg)
Java meets functional programming (with lambdas)
![Page 8: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/8.jpg)
Introducing our star feature - lambda
functions
![Page 9: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/9.jpg)
List<String> strings = Arrays.asList("eeny", "meeny", "miny", "mo");Consumer<String> printString = string -> System.out.println(string); strings.forEach(printString);
Lambda functions!
![Page 10: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/10.jpg)
But what are lambdas?
![Page 11: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/11.jpg)
Lambdas is just a fancy name for functions
without a name!
![Page 12: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/12.jpg)
Arrays.asList("eeny", "meeny", "miny", “mo”) .forEach(string -> System.out.println(string));
Internal Iteration
List<String> strings = Arrays.asList("eeny", "meeny", "miny", "mo");for(String string : strings) {
System.out.println(string);}
External Iteration
Lambda expression
![Page 13: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/13.jpg)
You can use lambdas for some amazing stuff
![Page 14: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/14.jpg)
sediment pre-carbon ultra-filter post-
carbonFiltered water
E.g., you can compose lambda functions as in pipes-and-filters
![Page 15: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/15.jpg)
$ cat limerick.txt There was a young lady of Niger Who smiled as she rode on a tiger. They returned from the ride With the lady inside And a smile on the face of the tiger.
![Page 16: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/16.jpg)
$ cat limerick.txt | tr -cs "[:alpha:]" "\n" | awk '{print length(), $0}' | sort | uniq1 a 2 as 2 of 2 on 3 And 3 Who 3 she 3 the 3 was 4 They 4 With 4 face 4 from 4 lady 4 ride 4 rode 5 Niger 5 There 5 smile 5 tiger 5 young 6 inside 6 smiled 8 returned
![Page 17: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/17.jpg)
List<String> lines = Files.readAllLines(Paths.get("./limerick.txt"), Charset.defaultCharset());
Map<Integer, List<String>> wordGroups = lines.stream() .map(line -> line.replaceAll("\\W", "\n").split("\n")) .flatMap(Arrays::stream) .sorted() .distinct() .collect(Collectors.groupingBy(String::length));
wordGroups.forEach( (count, words) -> { words.forEach(word -> System.out.printf("%d %s %n", count, word)); });
1 a 2 as 2 of 2 on 3 And 3 Who 3 she 3 the 3 was 4 They 4 With 4 face 4 from 4 lady 4 ride 4 rode 5 Niger 5 There 5 smile 5 tiger 5 young 6 inside 6 smiled 8 returned
![Page 18: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/18.jpg)
Lambdas & streams help in productive programming!
![Page 19: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/19.jpg)
public static void main(String []file) throws Exception { // process each file passed as argument
// try opening the file with FileReader try (FileReader inputFile = new FileReader(file[0])) { int ch = 0; while( (ch = inputFile.read()) != -1) { // ch is of type int - convert it back to char System.out.print( (char)ch ); } } // try-with-resources will automatically release FileReader object }
public static void main(String []file) throws Exception { Files.lines(Paths.get(file[0])).forEach(System.out::println); }
Existing APIs are enriched with lambdas and streams support
![Page 20: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/20.jpg)
So, lets get our hands dirty and start coding
![Page 21: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/21.jpg)
interface LambdaFunction { void call(); }
class FirstLambda { public static void main(String []args) { LambdaFunction lambdaFunction = () -> System.out.println("Hello world"); lambdaFunction.call(); } }
Functional interface - provides signature for lambda functions
Lambda function/expression
Call to the lambda
Prints “Hello world” on the console when executed
![Page 22: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/22.jpg)
@FunctionalInterface interface LambdaFunction { void call(); }
Functional interface
Abstract method providing the signature of the lambda function
Annotation to explicitly state that it is a functional interface
![Page 23: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/23.jpg)
arg -> System.out.println(arg)
System.out::println
Method references - “syntactic sugar” for lambda functions
They “route” function parameters
![Page 24: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/24.jpg)
Java 8 streams (and parallel streams): Excellent example of applying functional
programming in practice
![Page 25: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/25.jpg)
But what are streams?
![Page 26: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/26.jpg)
Arrays.stream(Object.class.getMethods()) .map(method -> method.getName()) .distinct() .forEach(System.out::println);
wait equals toString hashCode getClass notify notifyAll
![Page 27: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/27.jpg)
Method[] objectMethods = Object.class.getMethods(); Stream<Method> objectMethodStream = Arrays.stream(objectMethods); Stream<String> objectMethodNames
= objectMethodStream.map(method -> method.getName()); Stream<String> uniqueObjectMethodNames = objectMethodNames.distinct(); uniqueObjectMethodNames.forEach(System.out::println);
Arrays.stream(Object.class.getMethods()) .map(method -> method.getName()) .distinct() .forEach(System.out::println);
Breaking up into separate (looong) statements for our
understanding
![Page 28: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/28.jpg)
stream pipelineStreamsource
Intermediateopera1ons
Terminalopera1on
stream
stream
Examples:IntStream.range(),Arrays.stream()
Examples:map(),filter(),dis1nct(),sorted()
Examples:sum(),collect(),forEach(),reduce()
![Page 29: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/29.jpg)
DoubleStream.of(1.0,4.0,9.0) map(Math::sqrt) .peek(System.out::
println)
StreamSource(withelements1.0,4.0,and9.0)
IntermediateOpera=on1(mapsto
elementvalues1.0,2.0,and3.0)
IntermediateOpera=on2
(prints1.0,2.0,and3.0)
.sum();
TerminalOpera=on(returnsthesum6.0)
DoubleStream.of(1.0, 4.0, 9.0) .map(Math::sqrt) .peek(System.out::println) .sum();
![Page 30: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/30.jpg)
IntStream.range(1, 6)
You can use range or iterate factory methods in the
IntStream interface
IntStream.iterate(1, i -> i + 1).limit(5)
![Page 31: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/31.jpg)
1 2 3 4 5
1 4 9 16 25
map(i->i*i)
IntStream.range(1, 5).map(i -> i * i).forEach(System.out::println);
Using streams instead of imperative for i = 1 to 5, print i * i
![Page 32: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/32.jpg)
Stream.of (1, 2, 3, 4, 5) .map(i -> i * i) .peek(i -> System.out.printf("%d ", i)) .count();
prints: 1 4 9 16 25
![Page 33: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/33.jpg)
stream can be infinite
IntStream.iterate(0, i -> i + 2).forEach(System.out::println);
This code creates infinite stream of even numbers!
![Page 34: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/34.jpg)
IntStream .iterate(0, i -> i + 2) .limit(5) .forEach(System.out::println);
Using the “limit” function to limit the stream to 5 integers
![Page 35: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/35.jpg)
IntStream chars = "bookkeep".chars(); System.out.println(chars.count()); chars.distinct().sorted().forEach(ch -> System.out.printf("%c ", ch));
Cannot “reuse” a stream; this code throws IllegalStateException
![Page 36: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/36.jpg)
Streams are lazy!
![Page 37: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/37.jpg)
Files.lines(Paths.get("FileRead.java")).forEach(System.out::println);
This code prints the contents of the file “FileRead.java” in the
current directory
![Page 38: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/38.jpg)
Pattern.compile(" ").splitAsStream("java 8 streams").forEach(System.out::println);
This code splits the input string “java 8 streams” based on whitespace and hence
prints the strings “java”, “8”, and “streams” on the console
![Page 39: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/39.jpg)
new Random().ints().limit(5).forEach(System.out::println);
Generates 5 random integers and prints them on the console
![Page 40: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/40.jpg)
"hello".chars().sorted().forEach(ch -> System.out.printf("%c ", ch));
Extracts characters in the string “hello”, sorts the chars and prints the chars
![Page 41: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/41.jpg)
Parallel Streams
![Page 42: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/42.jpg)
race conditions
![Page 43: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/43.jpg)
![Page 44: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/44.jpg)
deadlocks
![Page 45: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/45.jpg)
![Page 46: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/46.jpg)
I really really hate concurrency problems
![Page 47: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/47.jpg)
Parallel code
Serial code
![Page 48: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/48.jpg)
Sometimes, dreams do come true even at 86 :-)
![Page 49: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/49.jpg)
So, keep dreaming till you become 86!
![Page 50: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/50.jpg)
long numOfPrimes = LongStream.rangeClosed(2, 100_000) .filter(PrimeNumbers::isPrime) .count();
System.out.println(numOfPrimes);
Prints 9592
2.510 seconds
![Page 51: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/51.jpg)
Parallel code
Serial code
Let’s flip the switch by calling parallel() function
![Page 52: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/52.jpg)
long numOfPrimes = LongStream.rangeClosed(2, 100_000) .parallel() .filter(PrimeNumbers::isPrime) .count();
System.out.println(numOfPrimes);
Prints 9592
1.235 seconds
![Page 53: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/53.jpg)
Wow! That’s an awesome flip switch!
![Page 54: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/54.jpg)
Internally, parallel streams make use of fork-join framework
![Page 55: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/55.jpg)
![Page 56: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/56.jpg)
import java.util.Arrays;
class StringConcatenator { public static String result = ""; public static void concatStr(String str) { result = result + " " + str; } }
class StringSplitAndConcatenate { public static void main(String []args) { String words[] = "the quick brown fox jumps over the lazy dog".split(" "); Arrays.stream(words).forEach(StringConcatenator::concatStr); System.out.println(StringConcatenator.result); } }
Gives wrong results with with parallel() call
![Page 57: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/57.jpg)
Adapt, learn functional programming!
![Page 58: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/58.jpg)
❖ Programming examples are from our book: ❖ Oracle Certified Professional
Java SE 8 Programmer Exam 1Z0-809: A Comprehensive OCPJP 8 Certification Guide, S.G. Ganesh, Hari Kiran Kumar, Tushar Sharma, Apress, 2016.
❖ Website: ocpjava.wordpress.com
![Page 59: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/59.jpg)
Image credits• http://www.wetplanetwhitewater.com/images/uploads/adam_mills_elliott82.jpg • http://s.ecrater.com/stores/321182/53e46c705f68d_321182b.jpg • http://img.viralpatel.net/2014/01/java-lambda-expression.png • https://i.ytimg.com/vi/3C0R_fEXcYA/maxresdefault.jpg • http://farm1.static.flickr.com/74/170765090_53762a686c.jpg • http://www.monazu.com/wp-content/uploads/2012/06/ask-the-right-questions.jpg • https://s-media-cache-ak0.pinimg.com/736x/43/42/8a/43428ac2c352166374d851e895ed5db1.jpg • http://cdn.attackofthecute.com/August-17-2011-12-36-23-peekaboo-
kitty-46f32anul-131384-530-410.jpeg • https://ludchurchmyblog.files.wordpress.com/2010/02/myths-legend-pictures-083.jpg • http://www.youramazingplaces.com/wp-content/uploads/2013/06/Mauvoisin-Dam-
Switzerland-620x413.jpg • http://www.welikeviral.com/files/2014/08/Image-914.jpg • http://geekandpoke.typepad.com/.a/6a00d8341d3df553ef013485f6be4d970c-800wi • https://qph.fs.quoracdn.net/main-qimg-56547c0506050206b50b80a268bf2a84 • https://i.ytimg.com/vi/kCVsKsgVhBA/maxresdefault.jpg • http://i.livescience.com/images/i/000/022/395/original/man-dreams-bed.jpg • https://static-secure.guim.co.uk/sys-images/Guardian/Pix/pictures/2012/11/26/1353952826063/Alarm-
clock-010.jpg
![Page 60: Sailing with Java 8 Streams](https://reader031.vdocuments.us/reader031/viewer/2022021500/58718b591a28ab2c198b652b/html5/thumbnails/60.jpg)
email [email protected]
website www.designsmells.com
twitter @GSamarthyam
linkedin bit.ly/sgganesh
slideshare slideshare.net/sgganesh