Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014...
Transcript of Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014...
![Page 1: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng](https://reader035.fdocuments.net/reader035/viewer/2022062916/5ec7520f955d41775411ba99/html5/thumbnails/1.jpg)
Lambdas and Streams in JDK 8
Simon Ri4er Head of Java Technology Evangelism Oracle Corp Twi4er: @speakjava
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
![Page 2: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng](https://reader035.fdocuments.net/reader035/viewer/2022062916/5ec7520f955d41775411ba99/html5/thumbnails/2.jpg)
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Safe Harbor Statement The following is intended to outline our general product direcRon. It is intended for informaRon purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or funcRonality, and should not be relied upon in making purchasing decisions. The development, release, and Rming of any features or funcRonality described for Oracle’s products remains at the sole discreRon of Oracle.
2
![Page 3: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng](https://reader035.fdocuments.net/reader035/viewer/2022062916/5ec7520f955d41775411ba99/html5/thumbnails/3.jpg)
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
1996 … 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 1.0 5.0 6 7 8 java.lang.Thread
java.util.concurrent (jsr166)
Fork/Join Framework (jsr166y)
Project Lambda Concurrency in Java
Phasers, etc (jsr166)
![Page 4: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng](https://reader035.fdocuments.net/reader035/viewer/2022062916/5ec7520f955d41775411ba99/html5/thumbnails/4.jpg)
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Lambdas In Java
![Page 5: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng](https://reader035.fdocuments.net/reader035/viewer/2022062916/5ec7520f955d41775411ba99/html5/thumbnails/5.jpg)
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
The Problem: External IteraRon
List<Student> students = ... double highestScore = 0.0; for (Student s : students) { if (s.getGradYear() == 2011) { if (s.getScore() > highestScore) highestScore = s.score; } }
• Our code controls iteraRon • Inherently serial: iterate from
beginning to end • Not thread-‐safe
• Business logic is stateful • Mutable accumulator variable
![Page 6: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng](https://reader035.fdocuments.net/reader035/viewer/2022062916/5ec7520f955d41775411ba99/html5/thumbnails/6.jpg)
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Internal IteraRon With Inner Classes
• IteraRon handled by the library • Not inherently serial – traversal may be done in parallel
• Traversal may be done lazily – so one pass, rather than three
• Thread safe – client logic is stateless • High barrier to use
– SyntacRcally ugly
More FuncRonal double highestScore = students .filter(new Predicate<Student>() { public boolean op(Student s) { return s.getGradYear() == 2011; } }) .map(new Mapper<Student,Double>() { public Double extract(Student s) { return s.getScore(); } }) .max();
![Page 7: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng](https://reader035.fdocuments.net/reader035/viewer/2022062916/5ec7520f955d41775411ba99/html5/thumbnails/7.jpg)
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Internal IteraRon With Lambdas List<Student> students = ... double highestScore = students .filter(Student s -‐> s.getGradYear() == 2011) .map(Student s -‐> s.getScore()) .max();
• More readable • More abstract
• Less error-‐prone
NOTE: This is not JDK8 code
![Page 8: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng](https://reader035.fdocuments.net/reader035/viewer/2022062916/5ec7520f955d41775411ba99/html5/thumbnails/8.jpg)
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Lambda Expressions
• Lambda expressions represent anonymous funcRons – Same structure as a method
• typed argument list, return type, set of thrown excepRons, and a body
– Not associated with a class • We now have parameterised behaviour, not just values
Some Details
double highestScore = students. filter(Student s -‐> s.getGradYear() == 2011). map(Student s -‐> s.getScore()) max();
What
How
![Page 9: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng](https://reader035.fdocuments.net/reader035/viewer/2022062916/5ec7520f955d41775411ba99/html5/thumbnails/9.jpg)
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Lambda Expression Types
• Single-‐method interfaces are used extensively in Java – DefiniRon: a func2onal interface is an interface with one abstract method – Func2onal interfaces are idenRfied structurally – The type of a lambda expression will be a func2onal interface
• Lambda expressions provide implementaRons of the abstract method
interface Comparator<T> { boolean compare(T x, T y); } interface FileFilter { boolean accept(File x); } interface Runnable { void run(); } interface ActionListener { void actionPerformed(…); } interface Callable<T> { T call(); }
![Page 10: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng](https://reader035.fdocuments.net/reader035/viewer/2022062916/5ec7520f955d41775411ba99/html5/thumbnails/10.jpg)
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Local Variable Capture
• Lambda expressions can refer to effec2vely final local variables from the enclosing scope
• EffecRvely final: A variable that meets the requirements for final variables (i.e., assigned once), even if not explicitly declared final
• Closures on values, not variables
void expire(File root, long before) { root.listFiles(File p -‐> p.lastModified() <= before);
}
![Page 11: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng](https://reader035.fdocuments.net/reader035/viewer/2022062916/5ec7520f955d41775411ba99/html5/thumbnails/11.jpg)
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
What Does ‘this’ Mean For Lambdas?
• ‘this’ refers to the enclosing object, not the lambda itself • Think of ‘this’ as a final predefined local • Remember the Lambda is an anonymous func2on
– It is not associated with a class – Therefore there can be no ‘this’ for the Lambda
![Page 12: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng](https://reader035.fdocuments.net/reader035/viewer/2022062916/5ec7520f955d41775411ba99/html5/thumbnails/12.jpg)
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Referencing Instance Variables Which are not final, or effecRvely final class DataProcessor { private int currentValue; public void process() { DataSet myData = myFactory.getDataSet(); dataSet.forEach(d -‐> d.use(currentValue++)); } }
![Page 13: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng](https://reader035.fdocuments.net/reader035/viewer/2022062916/5ec7520f955d41775411ba99/html5/thumbnails/13.jpg)
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Referencing Instance Variables The compiler helps us out class DataProcessor { private int currentValue; public void process() { DataSet myData = myFactory.getDataSet(); dataSet.forEach(d -‐> d.use(this.currentValue++); } }
‘this’ (which is effecRvely final) inserted by the compiler
![Page 14: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng](https://reader035.fdocuments.net/reader035/viewer/2022062916/5ec7520f955d41775411ba99/html5/thumbnails/14.jpg)
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Type Inference
• The compiler can ogen infer parameter types in a lambda expression § Inferrence based on the target funcRonal interface’s method signature
• Fully staRcally typed (no dynamic typing sneaking in) – More typing with less typing
List<String> list = getList(); Collections.sort(list, (String x, String y) -‐> x.length() -‐ y.length());
Collections.sort(list, (x, y) -‐> x.length() -‐ y.length());
static T void sort(List<T> l, Comparator<? super T> c);
![Page 15: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng](https://reader035.fdocuments.net/reader035/viewer/2022062916/5ec7520f955d41775411ba99/html5/thumbnails/15.jpg)
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Method References
• Method references let us reuse a method as a lambda expression
FileFilter x = File f -‐> f.canRead();
FileFilter x = File::canRead;
![Page 16: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng](https://reader035.fdocuments.net/reader035/viewer/2022062916/5ec7520f955d41775411ba99/html5/thumbnails/16.jpg)
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Constructor References
• Same concept as a method reference – For the constructor
Factory<List<String>> f = ArrayList<String>::new;
Factory<List<String>> f = () -‐> return new ArrayList<String>();
Replace with
![Page 17: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng](https://reader035.fdocuments.net/reader035/viewer/2022062916/5ec7520f955d41775411ba99/html5/thumbnails/17.jpg)
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Library EvoluRon
![Page 18: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng](https://reader035.fdocuments.net/reader035/viewer/2022062916/5ec7520f955d41775411ba99/html5/thumbnails/18.jpg)
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Library EvoluRon Goal
• Requirement: aggregate operaRons on collecRons – New methods required on CollecRons to facilitate this
• This is problemaRc – Can’t add new methods to interfaces without modifying all implementaRons – Can’t necessarily find or control all implementaRons
int heaviestBlueBlock = blocks .filter(b -‐> b.getColor() == BLUE) .map(Block::getWeight) .reduce(0, Integer::max);
![Page 19: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng](https://reader035.fdocuments.net/reader035/viewer/2022062916/5ec7520f955d41775411ba99/html5/thumbnails/19.jpg)
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
SoluRon: Default Methods
• Specified in the interface • From the caller’s perspecRve, just an ordinary interface method • Provides a default implementaRon
• Default only used when implementaRon classes do not provide a body for the extension method
• ImplementaRon classes can provide a be4er version, or not
interface Collection<E> { default Stream<E> stream() { return StreamSupport.stream(spliterator()); } }
![Page 20: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng](https://reader035.fdocuments.net/reader035/viewer/2022062916/5ec7520f955d41775411ba99/html5/thumbnails/20.jpg)
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Virtual Extension Methods
• Err, isn’t this implemenRng mulRple inheritance for Java? • Yes, but Java already has mulRple inheritance of types • This adds mulRple inheritance of behavior too • But not state, which is where most of the trouble is • Can sRll be a source of complexity
• Class implements two interfaces, both of which have default methods • Same signature • How does the compiler differenRate?
• StaRc methods also allowed in interfaces in Java SE 8
Stop right there!
![Page 21: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng](https://reader035.fdocuments.net/reader035/viewer/2022062916/5ec7520f955d41775411ba99/html5/thumbnails/21.jpg)
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
FuncRonal Interface DefiniRon
• Single Abstract Method (SAM) type • A funcRonal interface is an interface that has one abstract method
– Represents a single funcRon contract – Doesn’t mean it only has one method
• @FunctionalInterface annotaRon – Helps ensure the funcRonal interface contract is honoured – Compiler error if not a SAM
![Page 22: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng](https://reader035.fdocuments.net/reader035/viewer/2022062916/5ec7520f955d41775411ba99/html5/thumbnails/22.jpg)
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Lambdas In Full Flow: Streams
![Page 23: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng](https://reader035.fdocuments.net/reader035/viewer/2022062916/5ec7520f955d41775411ba99/html5/thumbnails/23.jpg)
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Stream Overview
• AbstracRon for specifying aggregate computaRons – Not a data structure – Can be infinite
• Simplifies the descripRon of aggregate computaRons – Exposes opportuniRes for opRmisaRon – Fusing, laziness and parallelism
At The High Level
![Page 24: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng](https://reader035.fdocuments.net/reader035/viewer/2022062916/5ec7520f955d41775411ba99/html5/thumbnails/24.jpg)
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Stream Overview
• A stream pipeline consists of three types of things – A source – Zero or more intermediate operaRons – A terminal operaRon
• Producing a result or a side-‐effect
Pipeline
int total = transactions.stream() .filter(t -‐> t.getBuyer().getCity().equals(“London”)) .mapToInt(Transaction::getPrice) .sum();
Source
Intermediate operaRon Terminal operaRon
![Page 25: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng](https://reader035.fdocuments.net/reader035/viewer/2022062916/5ec7520f955d41775411ba99/html5/thumbnails/25.jpg)
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Stream Sources
• From collecRons and arrays – Collection.stream() – Collection.parallelStream() – Arrays.stream(T array) or Stream.of()
• StaRc factories – IntStream.range() – Files.walk()
• Roll your own – java.util.Spliterator
Many Ways To Create
![Page 26: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng](https://reader035.fdocuments.net/reader035/viewer/2022062916/5ec7520f955d41775411ba99/html5/thumbnails/26.jpg)
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Stream Terminal OperaRons
• The pipeline is only evaluated when the terminal operaRon is called – All operaRons can execute sequenRally or in parallel – Intermediate operaRons can be merged
• Avoiding mulRple redundant passes on data • Short-‐circuit operaRons (e.g. findFirst) • Lazy evaluaRon
– Stream characterisRcs help idenRfy opRmisaRons • DISTINT stream passed to distinct() is a no-‐op
![Page 27: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng](https://reader035.fdocuments.net/reader035/viewer/2022062916/5ec7520f955d41775411ba99/html5/thumbnails/27.jpg)
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Maps and FlatMaps Map Values in a Stream
Map
FlatMap
Input Stream
Input Stream
1-‐to-‐1 mapping
1-‐to-‐many mapping
Output Stream
Output Stream
![Page 28: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng](https://reader035.fdocuments.net/reader035/viewer/2022062916/5ec7520f955d41775411ba99/html5/thumbnails/28.jpg)
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
OpRonal Class
• Terminal operaRons like min(), max(), etc do not return a direct result • Suppose the input Stream is empty? • Optional<T>
– Container for an object reference (null, or real object) – Think of it like a Stream of 0 or 1 elements – use get(), ifPresent() and orElse() to access the stored reference – Can use in more complex ways: filter(), map(), etc
Helping To Eliminate the NullPointerException
![Page 29: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng](https://reader035.fdocuments.net/reader035/viewer/2022062916/5ec7520f955d41775411ba99/html5/thumbnails/29.jpg)
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Example 1 Convert words in list to upper case
List<String> output = wordList .stream() .map(String::toUpperCase) .collect(Collectors.toList());
![Page 30: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng](https://reader035.fdocuments.net/reader035/viewer/2022062916/5ec7520f955d41775411ba99/html5/thumbnails/30.jpg)
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Example 1 Convert words in list to upper case (in parallel)
List<String> output = wordList .parallelStream() .map(String::toUpperCase) .collect(Collectors.toList());
![Page 31: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng](https://reader035.fdocuments.net/reader035/viewer/2022062916/5ec7520f955d41775411ba99/html5/thumbnails/31.jpg)
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Example 2
• BufferedReader has new method – Stream<String> lines()
Count lines in a file
long count = bufferedReader .lines() .count();
![Page 32: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng](https://reader035.fdocuments.net/reader035/viewer/2022062916/5ec7520f955d41775411ba99/html5/thumbnails/32.jpg)
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Example 3 Join lines 3-‐4 into a single string
String output = bufferedReader .lines() .skip(2) .limit(2) .collect(Collectors.joining());
![Page 33: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng](https://reader035.fdocuments.net/reader035/viewer/2022062916/5ec7520f955d41775411ba99/html5/thumbnails/33.jpg)
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Example 4 Collect all words in a file into a list
List<String> output = reader .lines() .flatMap(line -‐> Stream.of(line.split(REGEXP))) .filter(word -‐> word.length() > 0) .collect(Collectors.toList());
![Page 34: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng](https://reader035.fdocuments.net/reader035/viewer/2022062916/5ec7520f955d41775411ba99/html5/thumbnails/34.jpg)
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Example 5 List of unique words in lowercase, sorted by length
List<String> output = reader .lines() .flatMap(line -‐> Stream.of(line.split(REGEXP))) .filter(word -‐> word.length() > 0) .map(String::toLowerCase) .distinct() .sorted((x, y) -‐> x.length() -‐ y.length()) .collect(Collectors.toList());
![Page 35: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng](https://reader035.fdocuments.net/reader035/viewer/2022062916/5ec7520f955d41775411ba99/html5/thumbnails/35.jpg)
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Example 6: Real World Infinite stream from thermal sensor
private int double currentTemperature; ... thermalReader .lines() .mapToDouble(s -‐> Double.parseDouble(s.substring(0, s.length() -‐ 1))) .map(t -‐> ((t – 32) * 5 / 9) .filter(t -‐> t != currentTemperature) .peek(t -‐> listener.ifPresent(l -‐> l.temperatureChanged(t))) .forEach(t -‐> currentTemperature = t);
![Page 36: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng](https://reader035.fdocuments.net/reader035/viewer/2022062916/5ec7520f955d41775411ba99/html5/thumbnails/36.jpg)
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Example 6: Real World Infinite stream from thermal sensor
private int double currentTemperature; ... thermalReader .lines() .mapToDouble(s -‐> Double.parseDouble(s.substring(0, s.length() -‐ ))) .map(t -‐> ((t – 32) * 5 / 9) .filter(t -‐> t != this.currentTemperature) .peek(t -‐> listener.ifPresent(l -‐> l.temperatureChanged(t))) .forEach(t -‐> this.currentTemperature = t);
![Page 37: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng](https://reader035.fdocuments.net/reader035/viewer/2022062916/5ec7520f955d41775411ba99/html5/thumbnails/37.jpg)
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Conclusions
• Java needs lambda statements – Significant improvements in exisRng libraries are required
• Require a mechanism for interface evoluRon – SoluRon: virtual extension methods
• Bulk operaRons on CollecRons – Much simpler with Lambdas
• Java SE 8 evolves the language, libraries, and VM together
![Page 38: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng](https://reader035.fdocuments.net/reader035/viewer/2022062916/5ec7520f955d41775411ba99/html5/thumbnails/38.jpg)
Simon Ri4er Oracle CorporarRon Twi4er: @speakjava
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.