JavaOne 2013: Java 8 - The Good Parts
-
Upload
konrad-malawski -
Category
Technology
-
view
26.139 -
download
1
description
Transcript of JavaOne 2013: Java 8 - The Good Parts
![Page 1: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/1.jpg)
START
![Page 2: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/2.jpg)
Movie Time!
![Page 3: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/3.jpg)
![Page 4: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/4.jpg)
Andrzej Grzesik Konrad Malawski
![Page 5: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/5.jpg)
JAVA 8
Andrzej Grzesik Konrad Malawski
![Page 6: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/6.jpg)
JAVA 8THE GOOD PARTS
Andrzej Grzesik Konrad Malawski
![Page 7: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/7.jpg)
Andrzej Grzesik
![Page 8: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/8.jpg)
ABOUT:ME
![Page 9: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/9.jpg)
Konrad `@ktosopl` Malawski
![Page 10: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/10.jpg)
Konrad `@ktosopl` Malawski
![Page 11: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/11.jpg)
OUR OPINIONSARE OUR OWN
disclaimer
![Page 12: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/12.jpg)
QUESTIONS?
![Page 13: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/13.jpg)
QUESTIONS?ask them right away!
![Page 14: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/14.jpg)
JAVA 8 is going to be amazing!
![Page 15: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/15.jpg)
TWITTER SAYS:
![Page 16: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/16.jpg)
JAVA 8 IS THE NEW GUAVA
THE MOST EXCITING RELEASE IN HISTORY
![Page 17: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/17.jpg)
DONE WITH COMMUNITY
![Page 18: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/18.jpg)
ADOPT OPENJDKadoptopenjdk.java.net
![Page 19: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/19.jpg)
![Page 20: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/20.jpg)
![Page 21: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/21.jpg)
YOU CAN HELP!
![Page 22: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/22.jpg)
FIX TESTHACK
DOCUMENT
![Page 23: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/23.jpg)
ADOPTOPENJDK.JAVA.NET
![Page 24: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/24.jpg)
ADOPTAJSR.JAVA.NET
![Page 25: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/25.jpg)
HOW DO I CHECK JDK8?
![Page 26: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/26.jpg)
JDK8.JAVA.NET
![Page 27: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/27.jpg)
IDE SUPPORT
![Page 28: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/28.jpg)
![Page 30: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/30.jpg)
JENV$ jenv versions
system oracle64-1.6.0.51 oracle64-1.7.0.40 * oracle64-1.8.0-ea (set by /Users/ktoso/.jenv/version)
![Page 31: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/31.jpg)
JENV
ktoso @ 月/tmp$ jenv local oracle64-1.7.0.40
![Page 32: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/32.jpg)
JENV
ktoso @ 月/tmp$ jenv versions systema oracle64-1.6.0.51* oracle64-1.7.0.40 (set by /tmp/.java-version) oracle64-1.8.0-ea
ktoso @ 月/tmp$ jenv local oracle64-1.7.0.40
![Page 33: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/33.jpg)
NEW TIME APIjsr 310
![Page 34: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/34.jpg)
void immutable() { LocalTime aTime = LocalTime.now(); print("now: %s", aTime);
LocalTime newTime = aTime.plusMinutes(16); print("now: %s, later: %s", aTime, newTime); }
![Page 35: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/35.jpg)
void immutable() { LocalTime aTime = LocalTime.now(); print("now: %s", aTime);
LocalTime newTime = aTime.plusMinutes(16); print("now: %s, later: %s", aTime, newTime); }
now: 01:25:56.916
![Page 36: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/36.jpg)
now: 01:25:56.916later: 01:41:56.916
void immutable() { LocalTime aTime = LocalTime.now(); print("now: %s", aTime);
LocalTime newTime = aTime.plusMinutes(16); print("now: %s, later: %s", aTime, newTime); }
now: 01:25:56.916
![Page 37: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/37.jpg)
private void localTime() { LocalDate today = LocalDate.now(); LocalDate yesterday = today.minusDays(1);
// Geek Bike Ride! LocalDateTime localDateTime = yesterday.atTime(11, 30);
LocalDateTime earlyMorning = LocalDate.of(2013, 9, 22) .atStartOfDay(); }
![Page 38: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/38.jpg)
void flightTime() { ZoneId LHR = ZoneId.of("Europe/London"); ZoneId SFO = ZoneId.of("America/Los_Angeles");
LocalDate date = LocalDate.of(2013, Month.SEPTEMBER, 14); LocalTime takeoff = LocalTime.of(12, 50); LocalTime landing = LocalTime.of(16, 20); Duration flightTime = Duration.between( ZonedDateTime.of(date, takeoff, LHR), ZonedDateTime.of(date, landing, SFO));
System.out.println("Flight time: " + flightTime); }
![Page 39: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/39.jpg)
void flightTime() { ZoneId LHR = ZoneId.of("Europe/London"); ZoneId SFO = ZoneId.of("America/Los_Angeles");
LocalDate date = LocalDate.of(2013, Month.SEPTEMBER, 14); LocalTime takeoff = LocalTime.of(12, 50); LocalTime landing = LocalTime.of(16, 20); Duration flightTime = Duration.between( ZonedDateTime.of(date, takeoff, LHR), ZonedDateTime.of(date, landing, SFO));
System.out.println("Flight time: " + flightTime); } Flight time:
PT11H30M
![Page 40: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/40.jpg)
ISO BY DEFAULT
![Page 41: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/41.jpg)
NO MOREnew SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'");
![Page 42: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/42.jpg)
void formatting() { DateTimeFormatter.ISO_DATE. format(LocalDateTime.of(2013, 9, 22, 10, 03));
DateTimeFormatter.ISO_DATE_TIME. format(LocalDateTime.of(2013, 9, 22, 10, 30)); }
![Page 43: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/43.jpg)
void formatting() { DateTimeFormatter.ISO_DATE. format(LocalDateTime.of(2013, 9, 22, 10, 03));
DateTimeFormatter.ISO_DATE_TIME. format(LocalDateTime.of(2013, 9, 22, 10, 30)); }
2013-09-22
![Page 44: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/44.jpg)
void formatting() { DateTimeFormatter.ISO_DATE. format(LocalDateTime.of(2013, 9, 22, 10, 03));
DateTimeFormatter.ISO_DATE_TIME. format(LocalDateTime.of(2013, 9, 22, 10, 30)); }
2013-09-22
2013-09-22T10:30:00
![Page 45: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/45.jpg)
void formatterError() { ISO_DATE_TIME.format(LocalDate.of(2013, 9, 22));
/*Exception in thread "main" java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: HourOfDay! at java.time.LocalDate.get0(LocalDate.java:670)! at java.time.LocalDate.getLong(LocalDate.java:649)! at java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:297)! (..)!*/ }
![Page 46: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/46.jpg)
TUTORIALhttp://docs.oracle.com/javase/tutorial/datetime/index.html
![Page 47: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/47.jpg)
APIENHANCEMENTS
![Page 48: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/48.jpg)
BETTER IO
![Page 49: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/49.jpg)
void betterIO(){ BufferedReader bufferedReader; Path path;
Stream<String> lines = bufferedReader.lines(); Stream<String> lines = Files.lines(Path, Charset);
Stream<Path> paths = Files.list(Path); Stream<Path> paths = Files.find(Path, depth, BiPredicate, FileVisitOption...)
Stream<Path> paths = Files.walk(Path, depth, FileVisitOption...) Stream<Path> paths = Files.walk(Path, FileVisitOption...)
DirectoryStream.stream()}
![Page 50: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/50.jpg)
MAPS
![Page 51: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/51.jpg)
compute() { map.compute(aKey, new BiFunction<Key, Value, Value>() { @Override public Value apply(Key key, Value value) { // ... } }); map.computeIfAbsent(aKey, new Function<Key, Value>() { @Override public Value apply(Key key) { // ... } });
map.computeIfPresent(aKey, new BiFunction<Key, Value, Value>() { @Override public Value apply(Key key, Value value) { // ... } }); }
![Page 52: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/52.jpg)
void computeWithLambdas() { Map<Key, Value> map = // ...
map.computeIfAbsent(aKey, key -> { // ... });
map.computeIfPresent(aKey, (key, value) -> { // ... }); }
![Page 53: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/53.jpg)
void moreMaps(){ Map<Key, Value> map = null;
map.putIfAbsent(K, V); map.remove(Object, Object); map.replace(K, V); // Compare and swap map.replace(K, V1, V2); map.replaceAll(BiFunction); map.getOrDefault(K, V);
map.merge(K, V, BiFunction)}
![Page 54: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/54.jpg)
[5, 8, 6, 7, 2, 1, 4, 3]
void parallelSetAll() { int[] array = new int[8];
AtomicInteger i = new AtomicInteger(); Arrays.parallelSetAll(array, operand -> i.incrementAndGet()); }
![Page 55: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/55.jpg)
void parallelPrefix() { int[] array = { 1, 2, 4, 8 };
Arrays.parallelPrefix(array, (left, right) -> { return left + right; }); }
![Page 56: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/56.jpg)
LAMBDAS?
![Page 57: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/57.jpg)
LAMBDAS!(finally)
![Page 58: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/58.jpg)
LAMBDAS
Notable inspirations would be:
ScalaGroovyLisps
.NOT (!)
![Page 59: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/59.jpg)
() -> {}
LAMBDAS
![Page 60: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/60.jpg)
LAMBDAS
(Thing t) -> {}
![Page 61: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/61.jpg)
LAMBDAS
![Page 62: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/62.jpg)
LAMBDAS
(Thing t) -> {}
![Page 63: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/63.jpg)
LAMBDAS
(Thing t) -> {}
(Thing t, More m) -> {}
![Page 64: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/64.jpg)
LAMBDAS & TYPES
![Page 65: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/65.jpg)
LAMBDAS & TYPES
GetNum _ = (t) -> {42}
![Page 66: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/66.jpg)
LAMBDAS & TYPES
GetNum _ = (t) -> {42}GetNum _ = (t) -> 42
![Page 67: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/67.jpg)
LAMBDAS & TYPES
GetNum _ = (t) -> {42}GetNum _ = (t) -> 42GetNum _ = t -> 1337
![Page 68: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/68.jpg)
interface Adder { void add(int a, int b);}
TARGET TYPING
![Page 69: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/69.jpg)
interface Adder { void add(int a, int b);}
TARGET TYPING
Adder function = (int a, int b) -> { a + b };
![Page 70: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/70.jpg)
interface Adder { void add(int a, int b);}
TARGET TYPING
Adder function = (int a, int b) -> { a + b };
![Page 71: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/71.jpg)
interface Adder { void add(int a, int b);}
TARGET TYPING
Adder function = (int a, int b) -> { a + b };
(int, int) => int
gets converted into target type:
Adder
![Page 72: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/72.jpg)
interface Adder { void add(int a, int b);}
TARGET TYPING
Adder function = (int a, int b) -> { a + b };
// or shorter:
Adder function = (a, b) -> a + b;
![Page 73: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/73.jpg)
interface Adder { void add(int a, int b);}
TARGET TYPING
Adder function = (int a, int b) -> { a + b };
// or shorter:
Adder function = (a, b) -> a + b;
You can skip the ; sign!
![Page 74: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/74.jpg)
interface Adder { void add(int a, int b);}
TARGET TYPING
Adder function = (int a, int b) -> { a + b };
// or shorter:
Adder function = (a, b) -> a + b;
You can skip { } sometimes
You can skip the ; sign!
![Page 75: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/75.jpg)
interface Adder { void add(int a, int b);}
TARGET TYPING
Adder function = (int a, int b) -> { a + b };
// or shorter:
Adder function = (a, b) -> a + b;
You can skip { } sometimes
You can skip the ; sign!
and the types are inferred!
![Page 76: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/76.jpg)
FUNCTIONAL INTERFACES
interface Adder { void add(int a, int b);}
![Page 77: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/77.jpg)
FUNCTIONAL INTERFACES
@FunctionalInterfaceinterface Adder { void add(int a, int b);}
![Page 78: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/78.jpg)
FUNCTIONAL INTERFACES
@FunctionalInterfaceinterface Adder { void add(int a, int b);}
Similar to @Override: * not required,* checks our intent.
![Page 79: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/79.jpg)
FUNCTIONAL INTERFACES
@FunctionalInterfaceinterface Adder { void add(int a, int b); void wat();}
![Page 80: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/80.jpg)
FUNCTIONAL INTERFACES
@FunctionalInterfaceinterface Adder { void add(int a, int b); void wat();}
java: Unexpected @FunctionalInterface annotation pl.project13.lambda.test.examples.Adder is not a functional interface multiple non-overriding abstract methods found in interface pl.project13.lambda.test.examples.Adder
![Page 81: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/81.jpg)
DEFAULT METHODS
@FunctionalInterfaceinterface Adder { void add(int a, int b); default void wat() { /* nothing... */ }}
OK!Only 1 abstract method.
![Page 82: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/82.jpg)
DEFAULT METHODS@FunctionalInterfaceinterface Adder { default int add(int a, int b) { return a + b; }}
@FunctionalInterfaceinterface Divider { default double divide(int a, int b) { return a / b; }}
class Calculator implements Adder, Divider {
public double calc(int a, int b, int c) { return divide(add(a, b), c); }}
![Page 83: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/83.jpg)
DEFAULT METHODS
We mixed in methods!
here! and here!
@FunctionalInterfaceinterface Adder { default int add(int a, int b) { return a + b; }}
@FunctionalInterfaceinterface Divider { default double divide(int a, int b) { return a / b; }}
class Calculator implements Adder, Divider {
public double calc(int a, int b, int c) { return divide(add(a, b), c); }}
![Page 84: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/84.jpg)
interface A { default void doIt() { /* A */ }}
interface B { default void doIt() { /* B */ }}
class Thing implements A, B {}
DEFAULT METHODS
![Page 85: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/85.jpg)
interface A { default void doIt() { /* A */ }}
interface B { default void doIt() { /* B */ }}
class Thing implements A, B {}
DEFAULT METHODS
java: class com.javaone.Thing inherits unrelated defaults for doIt() from types com.javaone.A and com.javaone.B
![Page 86: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/86.jpg)
DEFAULT METHODS
interface A { default void doIt() { /* A */ }}
interface B { default void doIt() { /* B */ }}
class Thing implements A, B { @Override public void doIt() { A.super.doIt(); }}
Resolve ambiguity manually!
![Page 87: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/87.jpg)
DEFAULT METHODS
interface A { default void doIt() { /* A */ }}
interface B { default void doIt() { /* B */ }}
class Thing implements A, B { @Override public void doIt() { A.super.doIt(); }}
Resolve ambiguity manually!
![Page 88: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/88.jpg)
DEFAULT IN ITERABLEpackage java.lang;
@FunctionalInterfacepublic interface Iterable<T> { Iterator<T> iterator();
/** @since 1.8 */ default void forEach(Consumer<? super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } }
![Page 89: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/89.jpg)
void withoutLambda() { button.addActionListener(new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { System.out.println("example"); } }); }
λ IN ACTION
![Page 90: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/90.jpg)
BEFORE LAMBDASin IntelliJ
![Page 91: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/91.jpg)
void withLambda() { button.addActionListener((e) -> { System.out.println("example"); }); }
λ IN ACTION
![Page 92: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/92.jpg)
void composingFunctions() { // given Function<Integer, Integer> timesTwo = n -> n * 2; Function<Integer, Integer> plusOne = n -> n + 1;
// when Function<Integer, Integer> multiplyThenAdd = timesTwo.andThen(plusOne);
// equivalent to Function<Integer, Integer> multiplyThenAdd = plusOne.compose(timesTwo);
// then int result = multiplyThenAdd.apply(1); assertThat(result).isEqualTo(3);
}
![Page 93: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/93.jpg)
REMOVING BOILERPLATE
![Page 94: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/94.jpg)
STREAMS
![Page 95: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/95.jpg)
void transform() { Iterables.transform( newArrayList(1, 2, 3), new Function<Integer, String>() { @Override public String apply(Integer input) { return input.toString(); } }); }
![Page 96: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/96.jpg)
void transform() { Iterables.transform( newArrayList(1, 2, 3), new Function<Integer, String>() { @Override public String apply(Integer input) { return input.toString(); } }); }
void noMoreTransform() { items.stream().map(i -> i.toString()); }
vs
![Page 97: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/97.jpg)
items.stream().map(Item::getName);
compared to Scala
items map { _.getName }
![Page 98: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/98.jpg)
items.stream().map(Item::getName);
yay, we’re cool now!
compared to Scala
items map { _.getName }
![Page 99: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/99.jpg)
STREAMS
items.stream().
filter(predicate); map(mapper); mapToInt(mapper); flatMap(mapper); distinct(); sorted(); sorted(comparator); peek(consumer); limit(maxSize); forEach(func);
![Page 100: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/100.jpg)
INTERNAL ITERATION void internalIteration() { List<Thing> things = ...;
things.forEach(System.out::println); }
![Page 101: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/101.jpg)
PARALLELIZE?
![Page 102: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/102.jpg)
PARALLEL ITERATION
void parallelIteration() { List<Thing> things = ...;
things.parallelStream().forEach(System.out::println); }
![Page 103: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/103.jpg)
STREAMS ARE LAZY!
![Page 104: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/104.jpg)
List<Integer> is = newArrayList(1, 2, 3);
is.stream() .map(a -> printAndReturn("A", a)) .map(a -> printAndReturn("B", a));
STREAMS ARE LAZY
![Page 105: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/105.jpg)
List<Integer> is = newArrayList(1, 2, 3);
is.stream() .map(a -> printAndReturn("A", a)) .map(a -> printAndReturn("B", a));
Prints:
STREAMS ARE LAZY
![Page 106: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/106.jpg)
List<Integer> is = newArrayList(1, 2, 3);
is.stream() .map(a -> printAndReturn("A", a)) .map(a -> printAndReturn("B", a));
Prints:
STREAMS ARE LAZY
Nothing!
![Page 107: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/107.jpg)
STREAMS ARE LAZYList<Integer> is = newArrayList(1, 2, 3);
is.stream() .map(a -> printAndReturn("A", a)) .map(a -> printAndReturn("B", a)) .collect(toList());
![Page 108: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/108.jpg)
STREAMS ARE LAZYList<Integer> is = newArrayList(1, 2, 3);
is.stream() .map(a -> printAndReturn("A", a)) .map(a -> printAndReturn("B", a)) .collect(toList());
Prints:
A1B1A2B2A3B3
![Page 109: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/109.jpg)
STREAMS ARE LAZYList<Integer> is = newArrayList(1, 2, 3);
is.stream() .map(a -> printAndReturn("A", a)) .map(a -> printAndReturn("B", a)) .collect(toList());
Prints:
A1B1A2B2A3B3
It’s ONE iteration!
![Page 110: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/110.jpg)
METHOD HANDLESthink function pointers
![Page 111: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/111.jpg)
KEEPING REFERENCES
??? method = Person::getName
class Person { String getName();}
?
![Page 112: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/112.jpg)
KEEPING REFERENCES
Supplier<String> method = Person::getName
@FunctionalInterfacepublic interface Supplier<T> { T get();}
class Person { String getName();}
![Page 113: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/113.jpg)
void referringToMethods() { String name = Person.getName();
String name = applyTo(heinz, Person::getName); }
![Page 114: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/114.jpg)
REFERRING TO METHODS
String normalName = heinz.getName();
String magicName = applyTo(heinz, Person::getName);
public <T, R> R applyTo(T obj, Function<T, R> function) { return function.apply(obj);}
![Page 115: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/115.jpg)
JAVA.UTIL.FUNCTION.*Supplier<T> => T
Consumer<T> T => void
Predicate<T> T => Boolean
BiPredicate<T1, T2> (T1, T2) => Boolean
Function<T, R> T => R
BiFunction<T1, T2, R> (T1, T2) => R
and more...!
![Page 116: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/116.jpg)
Fact: in order to refer to:
String doThing(String a, String b, String c, Integer d);
JAVA.UTIL.FUNCTION.*
![Page 117: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/117.jpg)
Fact: in order to refer to:
String doThing(String a, String b, String c, Integer d);
you have to:
@FunctionalInterface interface Function4<T1, T2, T3, T4, R> { R apply(T1 a, T2 b, T3 c, T4 d); }
JAVA.UTIL.FUNCTION.*
![Page 118: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/118.jpg)
Fact: in order to refer to:
String doThing(String a, String b, String c, Integer d);
you have to:
@FunctionalInterface interface Function4<T1, T2, T3, T4, R> { R apply(T1 a, T2 b, T3 c, T4 d); }
Function4<String, String, String, Integer, String> fun = Example::doThing;
JAVA.UTIL.FUNCTION.*
![Page 119: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/119.jpg)
BACK TO THE FUTURE!● http://cr.openjdk.java.net/~briangoetz/
lambda/collections-overview.html
● http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html
● http://www.techempower.com/blog/2013/03/26/everything-about-java-8/
● For fun, Lambda Spec: github.com/ktoso/lambda-spec
![Page 120: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/120.jpg)
THANK YOU!
![Page 121: JavaOne 2013: Java 8 - The Good Parts](https://reader035.fdocuments.net/reader035/viewer/2022070300/540dcc478d7f72927e8b49f6/html5/thumbnails/121.jpg)
@ags313
Andrzej Grzesik Konrad Malawski
@ktosopl
TWEET PLEASE!