SlideShare a Scribd company logo
© Henri Tremblay 2015
Henri Tremblay
Senior Software Engineer
Terracotta, a Software AG company
Learn Java 8: Lambdas and Functional
Programming [TUT6198]
@henri_tremblay
2
Henri Tremblay
3
Henri Tremblay
4
Henri Tremblay
•  More or less made possible class mocking and proxying
•  Coined the term “partial mocking”
5
Henri Tremblay
•  More or less made possible class mocking and proxying
•  Coined the term “partial mocking”
6
7
Java < 8
8
Live Coding
9
8 minutes break (please do come back)
10
More Live Coding
11
Questions
12
You voting for me
13
Java 5
(2004)
14
JAVA 5 GAVE THE GENERIC
TYPES TO THE WORLD
(and also annotations, concurrent collections, enum types, for
each, static imports and so on and so on)
15
Type witness
MyClass.<List<String>> anyObject()
because you can’t
(List<String>) MyClass.anyObject()
16
Java 6
(2006, last from Sun)
17
JAVA 6 BROUGHT.. PRETTY
MUCH NOTHING
(a bunch of performance improvements under the hood, better xml
parsing and the first scripting api)
18
Java 7
(2011, first from Oracle)
19
JAVA 7 BROUGHT A LOT OF
SYNTACTIC SUGAR
(plus invokeDynamic, forkJoin, better file IO)
20
Switch for strings
switch(s) {
case "hello":
return "world";
case "bonjour":
return "le monde";
}
21
Diamond operator
List<String> list = new ArrayList<>();
22
Binary integer literals and underscores
int i = 0b1110001111;
int i = 1_000_000;
23
Multiple catches
try {
// ... do stuff
}
catch (IOException | SerializationException e) {
log.error("My error", e);
}
Instead of
try {
// ... do stuff
} catch (IOException e) {
log.error("My error", e);
} catch (SerializationException e) {
log.error("My error", e);
}
24
Auto Closeable
Before
InputStream in = new FileInputStream("allo.txt");
try {
// … do stuff
} finally {
try { in.close(); } catch(IOException e) {}
}
After
try(InputStream in = new FileInputStream("allo.txt")) {
// … do stuff
}
25
File IO API
List<String> lines =
Files.readAllLines(
Paths.get("path", "to", "my", "file.txt"));
// also: file watcher, symbolic links, file locks,
// copy … Look in java.nio.file
26
Java 8
(2014)
27
JAVA 8: LAMBDA!
(and also a new date API, default methods, metaspace, Nashorn,
JavaFX and CompletableFuture)
28
Base64 ;-)
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class Base64s {
public static void main(String[] args) {
final String text = "Base64 finally in Java 8!";
final String encoded = Base64
.getEncoder()
.encodeToString( text.getBytes( StandardCharsets.UTF_8 ) );
System.out.println( encoded );
final String decoded = new String(
Base64.getDecoder().decode( encoded ),
StandardCharsets.UTF_8 );
System.out.println( decoded );
}
}
29
Date / Time API
Core ideas:
  Immutable
  A time is a time, a date is a date. Not always both (like java.util.Date)
  Not everyone uses the same calendar (the same Chronology)
LocalDate, LocalTime, LocalDateTime à Local. No time zone
OffsetDateTime, OffsetTime à Time with an offset from
Greenwich
ZonedDateTime à LocalDateTime with a time zone
Duration, Period à Time span
Instant à Timestamp
Formatting à Easy and thread-safe formatting
30
Date / Time API (example)
LocalDateTime now = LocalDateTime.now();
String thatSpecialDay = now
.withDayOfMonth(1)
.atZone(ZoneId.of("Europe/Paris"))
.plus(Duration.ofDays(5))
.format(DateTimeFormatter.ISO_ZONED_DATE_TIME);
System.out.println(thatSpecialDay);
Output
2016-09-06T17:45:22.488+01:00[Europe/Paris]
31
Nashorn
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class Nashorn {
public static void main(String[] args) throws ScriptException {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName( "JavaScript" );
int i = (Integer) engine.eval( "function f() { return 1; }; f() + 1;");
System.out.println("Result: " + i);
}
}
Rhino Nashorn
Command
line: jjs
32
33
Lambda: 11th letter of the Greek alphabet
34
(also written as λ-calculus) is a formal system in
mathematical logic for expressing computation based
on function abstraction and application using variable
binding and substitution. It is a universal model of
computation that can be used to simulate any single-
taped Turing machine and was first introduced by
mathematician Alonzo Church in the 1930s as part of an
investigation into the foundations of mathematics.
Lambda calculus
35
This is a function:
This is a lambda:
Lambda calculus
36
c = sqrt(add(pow(a, 2), pow(b, 2)))
Functional programming
37
38
Lambda
// Classic
list.forEach(e -> System.out.println(e));
// Typed
list.forEach((String e) -> System.out.println(e));
// Multiline
list.forEach((String e) -> {
System.out.println(e);
});
// With closure
String greeting= "Hello ”;
list.forEach(e -> System.out.println(greeting + e));
39
Implicit final
List<String> list = new ArrayList<>();
String greeting = "Hello "; // no final required
list.forEach(s -> System.out.println(greeting + s));
list.forEach(new Consumer<String>() {
@Override public void accept(String s) {
System.out.println(greeting + s);
}
});
list.forEach(s -> greeting = “Hi”); // won’t compile
40
Everything is a lambda
public interface MyInterface {
int foo();
}
public void bar(MyInterface i) {
System.out.println(i.foo());
}
bar(() -> 4);
bar(new MyInterface() {
@Override public int foo() {
return 4;
}
});
JButton btn = new JButton();
btn.addActionListener(e -> {});
But it’s better to flag them
with
@FunctionalInterface
41
Method references
public static class Passenger {
public void inboard(Train train) {
System.out.println("Inboard " + train);
}
}
public static class Train {
public static Train create(Supplier< Train > supplier)
{
return supplier.get();
}
public static void paintBlue(Train train) {
System.out.println("Painted blue " + train);
}
public void repair() {
System.out.println( "Repaired " + this);
}
}
Train train = Train.create(Train::new); // constructor
List<Train> trains = Arrays.asList(train);
trains.forEach(Train::paintBlue); // static
method
trains.forEach(Train::repair); // instance
method
Passenger p = new Passenger();
trains.forEach(p::inboard); // instance
method taking this in param
trains.forEach(System.out::println); // useful!
42
Upside Down
public class MethodTest {
public class Foo {
static final String ERR_MESSAGE = "bad";
public void doIt() throws IllegalStateException {
throw new IllegalStateException(ERR_MESSAGE);
}
}
@Test
public void test() {
Foo foo = new Foo();
Throwable t = captureThrowable(foo::doIt);
assertThat(t)
.isInstanceOf(IllegalStateException.class)
.hasMessage(Foo.ERR_MESSAGE);
}
public static Throwable captureThrowable(Runnable r) {
Throwable result = null;
43
Streams
try(Stream<String> lines =
Files.lines(Paths.get("src/Streams.java"))) {
System.out.println(lines.findFirst());
}
44
Functional programming
List<String> list = new ArrayList<>();
int sum= list
.stream()
.filter(s -> s.startsWith("a"))
.mapToInt(String::length)
.sum();
List<Integer> length = list
.stream()
.map(String::length)
.collect(Collectors.toList());
45
Parallel
List<String> list = new ArrayList<>();
int sum = list
.parallelStream()
.filter(s -> s.startsWith("a"))
.mapToInt(String::length)
.sum();
Arrays.parallelSort(array);
46
Optional
try(Stream<String> lines =
Files.lines(Paths.get("src/Streams.java"))) {
System.out.println(lines.findFirst());
}
è  Optional[import java.io.IOException;]
Optional<String> findFirst();
Solution: lines.findFirst().get();
èimport java.io.IOException;
47
Interface default methods
public interface List<E> extends
Collection<E> {
default void replaceAll(UnaryOperator<E>
operator) {
// …
}
}
public interface A {
default void foo() { }
}
public interface B{
default void foo() { }
}
public class C implements A, B {} // forbidden
public class C implements A, B { // allowed
public void foo() { }
}
public static class D implements A, B { //
allowed
public void foo() {
A.super.foo();
}
}
48
Interface static methods
public interface IntStream {
static IntStream empty () {
return …;
}
}
IntStream stream = IntStream.empty ();
49
Break!
(8 minutes)
50
The End
51
Who has learned
something today?
?
52
Brian Goetz – State of the lambda
http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-
final.html
Ninja Squad – Lambda Kata
https://github.com/Ninja-Squad/ninjackaton-lambda
Maurice Naftalin’s lambda facts and books
http://www.lambdafaq.org/
  Mastering Lamdbas: Java Programming in a Multicore World
Links
53
54
Questions? http://montreal-jug.org
? http://easymock.org
http://objenesis.org
http:/ehcache.org
Henri Tremblay
http://blog.tremblay.pro
@henri_tremblay

More Related Content

PPTX
Java 8, lambdas, generics: How to survive? - NYC Java Meetup Group
PPTX
Generics and Lambdas cocktail explained - Montreal JUG
PPTX
Lambdas and Generics (long version) - Bordeaux/Toulouse JUG
PDF
Java 8 - project lambda
PPTX
Generics and Lambda survival guide - DevNexus 2017
PPTX
Lambda выражения и Java 8
PDF
Java 8 Lambda Expressions
PDF
Java Class Design
Java 8, lambdas, generics: How to survive? - NYC Java Meetup Group
Generics and Lambdas cocktail explained - Montreal JUG
Lambdas and Generics (long version) - Bordeaux/Toulouse JUG
Java 8 - project lambda
Generics and Lambda survival guide - DevNexus 2017
Lambda выражения и Java 8
Java 8 Lambda Expressions
Java Class Design

What's hot (20)

PPT
Java Generics for Dummies
PPTX
Java Generics
PDF
Procedural Programming: It’s Back? It Never Went Away
PDF
Functional Programming in Java 8 - Exploiting Lambdas
PDF
Refactoring to Immutability
PDF
Functional Thinking - Programming with Lambdas in Java 8
PDF
OCP Java SE 8 Exam - Sample Questions - Lambda Expressions
PDF
Java Class Design
PDF
PDF
Lambda? You Keep Using that Letter
PDF
Java and j2ee_lab-manual
PDF
PDF
Quark: A Purely-Functional Scala DSL for Data Processing & Analytics
PDF
Stacks
PPTX
Java generics
PDF
Porque aprender haskell me fez um programador python melhor?
PPTX
Anti patterns
PDF
Lambda and Stream Master class - part 1
PPT
Stack, queue and hashing
PPT
Educational slides by venay magen
Java Generics for Dummies
Java Generics
Procedural Programming: It’s Back? It Never Went Away
Functional Programming in Java 8 - Exploiting Lambdas
Refactoring to Immutability
Functional Thinking - Programming with Lambdas in Java 8
OCP Java SE 8 Exam - Sample Questions - Lambda Expressions
Java Class Design
Lambda? You Keep Using that Letter
Java and j2ee_lab-manual
Quark: A Purely-Functional Scala DSL for Data Processing & Analytics
Stacks
Java generics
Porque aprender haskell me fez um programador python melhor?
Anti patterns
Lambda and Stream Master class - part 1
Stack, queue and hashing
Educational slides by venay magen
Ad

Similar to JavaOne 2016 - Learn Lambda and functional programming (20)

PPTX
DevNexus 2020: Discover Modern Java
PPTX
DevNexus 2018: Learn Java 8, lambdas and functional programming
PDF
OracleCode One 2018: Java 5, 6, 7, 8, 9, 10, 11: What Did You Miss?
PDF
JSR 335 / java 8 - update reference
PPTX
Modern Java Workshop
DOCX
Colloquium Report
PPTX
Intro to java 8
PDF
NUS Hackers Club Mar 21 - Whats New in JavaSE 8?
PPTX
A brief tour of modern Java
PDF
Java Full Throttle
PPT
whats new in java 8
PPT
14274730 (1).ppt
PDF
What did you miss in Java from 9-13?
PPTX
New Features in JDK 8
PDF
Java 8
PPTX
New features in jdk8 iti
PPTX
Java World, Java Trends, Java 8 and Beyond (iForum - 2014)
PPTX
Java 8 briefing
PDF
Java jdk-update-nov10-sde-v3m
PDF
Java 8 Lambda
DevNexus 2020: Discover Modern Java
DevNexus 2018: Learn Java 8, lambdas and functional programming
OracleCode One 2018: Java 5, 6, 7, 8, 9, 10, 11: What Did You Miss?
JSR 335 / java 8 - update reference
Modern Java Workshop
Colloquium Report
Intro to java 8
NUS Hackers Club Mar 21 - Whats New in JavaSE 8?
A brief tour of modern Java
Java Full Throttle
whats new in java 8
14274730 (1).ppt
What did you miss in Java from 9-13?
New Features in JDK 8
Java 8
New features in jdk8 iti
Java World, Java Trends, Java 8 and Beyond (iForum - 2014)
Java 8 briefing
Java jdk-update-nov10-sde-v3m
Java 8 Lambda
Ad

More from Henri Tremblay (10)

PPTX
Confoo 2018: Être pragmatique
PPTX
Do you know your mock? - Madras JUG 20171028
PDF
Be Pragmatic - JavaOne 2017
PPTX
Confoo 2016: Initiation aux tests de charge
PPTX
Réactif, parallèle, asynchrone. Pourquoi!
PPTX
Perf university
PPTX
Microbenchmarking with JMH
PPTX
Vivre en parallèle - Softshake 2013
PPTX
Performance perpétuelle (Devopsdays Paris 2013)
PPTX
DevoxxFR 2013: Lambda are coming. Meanwhile, are you sure we've mastered the ...
Confoo 2018: Être pragmatique
Do you know your mock? - Madras JUG 20171028
Be Pragmatic - JavaOne 2017
Confoo 2016: Initiation aux tests de charge
Réactif, parallèle, asynchrone. Pourquoi!
Perf university
Microbenchmarking with JMH
Vivre en parallèle - Softshake 2013
Performance perpétuelle (Devopsdays Paris 2013)
DevoxxFR 2013: Lambda are coming. Meanwhile, are you sure we've mastered the ...

Recently uploaded (20)

PDF
Empathic Computing: Creating Shared Understanding
PDF
Chapter 2 Digital Image Fundamentals.pdf
PDF
Review of recent advances in non-invasive hemoglobin estimation
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PDF
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
PDF
NewMind AI Monthly Chronicles - July 2025
PPTX
MYSQL Presentation for SQL database connectivity
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PPTX
Telecom Fraud Prevention Guide | Hyperlink InfoSystem
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PDF
GDG Cloud Iasi [PUBLIC] Florian Blaga - Unveiling the Evolution of Cybersecur...
PDF
Electronic commerce courselecture one. Pdf
PPTX
Comunidade Salesforce São Paulo - Desmistificando o Omnistudio (Vlocity)
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
Advanced IT Governance
PDF
Sensors and Actuators in IoT Systems using pdf
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PDF
GamePlan Trading System Review: Professional Trader's Honest Take
Empathic Computing: Creating Shared Understanding
Chapter 2 Digital Image Fundamentals.pdf
Review of recent advances in non-invasive hemoglobin estimation
NewMind AI Weekly Chronicles - August'25 Week I
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
NewMind AI Monthly Chronicles - July 2025
MYSQL Presentation for SQL database connectivity
20250228 LYD VKU AI Blended-Learning.pptx
Telecom Fraud Prevention Guide | Hyperlink InfoSystem
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
GDG Cloud Iasi [PUBLIC] Florian Blaga - Unveiling the Evolution of Cybersecur...
Electronic commerce courselecture one. Pdf
Comunidade Salesforce São Paulo - Desmistificando o Omnistudio (Vlocity)
The Rise and Fall of 3GPP – Time for a Sabbatical?
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
Per capita expenditure prediction using model stacking based on satellite ima...
Advanced IT Governance
Sensors and Actuators in IoT Systems using pdf
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
GamePlan Trading System Review: Professional Trader's Honest Take

JavaOne 2016 - Learn Lambda and functional programming

  • 1. © Henri Tremblay 2015 Henri Tremblay Senior Software Engineer Terracotta, a Software AG company Learn Java 8: Lambdas and Functional Programming [TUT6198] @henri_tremblay
  • 4. 4 Henri Tremblay •  More or less made possible class mocking and proxying •  Coined the term “partial mocking”
  • 5. 5 Henri Tremblay •  More or less made possible class mocking and proxying •  Coined the term “partial mocking”
  • 6. 6
  • 9. 9 8 minutes break (please do come back)
  • 14. 14 JAVA 5 GAVE THE GENERIC TYPES TO THE WORLD (and also annotations, concurrent collections, enum types, for each, static imports and so on and so on)
  • 15. 15 Type witness MyClass.<List<String>> anyObject() because you can’t (List<String>) MyClass.anyObject()
  • 17. 17 JAVA 6 BROUGHT.. PRETTY MUCH NOTHING (a bunch of performance improvements under the hood, better xml parsing and the first scripting api)
  • 18. 18 Java 7 (2011, first from Oracle)
  • 19. 19 JAVA 7 BROUGHT A LOT OF SYNTACTIC SUGAR (plus invokeDynamic, forkJoin, better file IO)
  • 20. 20 Switch for strings switch(s) { case "hello": return "world"; case "bonjour": return "le monde"; }
  • 22. 22 Binary integer literals and underscores int i = 0b1110001111; int i = 1_000_000;
  • 23. 23 Multiple catches try { // ... do stuff } catch (IOException | SerializationException e) { log.error("My error", e); } Instead of try { // ... do stuff } catch (IOException e) { log.error("My error", e); } catch (SerializationException e) { log.error("My error", e); }
  • 24. 24 Auto Closeable Before InputStream in = new FileInputStream("allo.txt"); try { // … do stuff } finally { try { in.close(); } catch(IOException e) {} } After try(InputStream in = new FileInputStream("allo.txt")) { // … do stuff }
  • 25. 25 File IO API List<String> lines = Files.readAllLines( Paths.get("path", "to", "my", "file.txt")); // also: file watcher, symbolic links, file locks, // copy … Look in java.nio.file
  • 27. 27 JAVA 8: LAMBDA! (and also a new date API, default methods, metaspace, Nashorn, JavaFX and CompletableFuture)
  • 28. 28 Base64 ;-) import java.nio.charset.StandardCharsets; import java.util.Base64; public class Base64s { public static void main(String[] args) { final String text = "Base64 finally in Java 8!"; final String encoded = Base64 .getEncoder() .encodeToString( text.getBytes( StandardCharsets.UTF_8 ) ); System.out.println( encoded ); final String decoded = new String( Base64.getDecoder().decode( encoded ), StandardCharsets.UTF_8 ); System.out.println( decoded ); } }
  • 29. 29 Date / Time API Core ideas:   Immutable   A time is a time, a date is a date. Not always both (like java.util.Date)   Not everyone uses the same calendar (the same Chronology) LocalDate, LocalTime, LocalDateTime à Local. No time zone OffsetDateTime, OffsetTime à Time with an offset from Greenwich ZonedDateTime à LocalDateTime with a time zone Duration, Period à Time span Instant à Timestamp Formatting à Easy and thread-safe formatting
  • 30. 30 Date / Time API (example) LocalDateTime now = LocalDateTime.now(); String thatSpecialDay = now .withDayOfMonth(1) .atZone(ZoneId.of("Europe/Paris")) .plus(Duration.ofDays(5)) .format(DateTimeFormatter.ISO_ZONED_DATE_TIME); System.out.println(thatSpecialDay); Output 2016-09-06T17:45:22.488+01:00[Europe/Paris]
  • 31. 31 Nashorn import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; public class Nashorn { public static void main(String[] args) throws ScriptException { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName( "JavaScript" ); int i = (Integer) engine.eval( "function f() { return 1; }; f() + 1;"); System.out.println("Result: " + i); } } Rhino Nashorn Command line: jjs
  • 32. 32
  • 33. 33 Lambda: 11th letter of the Greek alphabet
  • 34. 34 (also written as λ-calculus) is a formal system in mathematical logic for expressing computation based on function abstraction and application using variable binding and substitution. It is a universal model of computation that can be used to simulate any single- taped Turing machine and was first introduced by mathematician Alonzo Church in the 1930s as part of an investigation into the foundations of mathematics. Lambda calculus
  • 35. 35 This is a function: This is a lambda: Lambda calculus
  • 36. 36 c = sqrt(add(pow(a, 2), pow(b, 2))) Functional programming
  • 37. 37
  • 38. 38 Lambda // Classic list.forEach(e -> System.out.println(e)); // Typed list.forEach((String e) -> System.out.println(e)); // Multiline list.forEach((String e) -> { System.out.println(e); }); // With closure String greeting= "Hello ”; list.forEach(e -> System.out.println(greeting + e));
  • 39. 39 Implicit final List<String> list = new ArrayList<>(); String greeting = "Hello "; // no final required list.forEach(s -> System.out.println(greeting + s)); list.forEach(new Consumer<String>() { @Override public void accept(String s) { System.out.println(greeting + s); } }); list.forEach(s -> greeting = “Hi”); // won’t compile
  • 40. 40 Everything is a lambda public interface MyInterface { int foo(); } public void bar(MyInterface i) { System.out.println(i.foo()); } bar(() -> 4); bar(new MyInterface() { @Override public int foo() { return 4; } }); JButton btn = new JButton(); btn.addActionListener(e -> {}); But it’s better to flag them with @FunctionalInterface
  • 41. 41 Method references public static class Passenger { public void inboard(Train train) { System.out.println("Inboard " + train); } } public static class Train { public static Train create(Supplier< Train > supplier) { return supplier.get(); } public static void paintBlue(Train train) { System.out.println("Painted blue " + train); } public void repair() { System.out.println( "Repaired " + this); } } Train train = Train.create(Train::new); // constructor List<Train> trains = Arrays.asList(train); trains.forEach(Train::paintBlue); // static method trains.forEach(Train::repair); // instance method Passenger p = new Passenger(); trains.forEach(p::inboard); // instance method taking this in param trains.forEach(System.out::println); // useful!
  • 42. 42 Upside Down public class MethodTest { public class Foo { static final String ERR_MESSAGE = "bad"; public void doIt() throws IllegalStateException { throw new IllegalStateException(ERR_MESSAGE); } } @Test public void test() { Foo foo = new Foo(); Throwable t = captureThrowable(foo::doIt); assertThat(t) .isInstanceOf(IllegalStateException.class) .hasMessage(Foo.ERR_MESSAGE); } public static Throwable captureThrowable(Runnable r) { Throwable result = null;
  • 44. 44 Functional programming List<String> list = new ArrayList<>(); int sum= list .stream() .filter(s -> s.startsWith("a")) .mapToInt(String::length) .sum(); List<Integer> length = list .stream() .map(String::length) .collect(Collectors.toList());
  • 45. 45 Parallel List<String> list = new ArrayList<>(); int sum = list .parallelStream() .filter(s -> s.startsWith("a")) .mapToInt(String::length) .sum(); Arrays.parallelSort(array);
  • 46. 46 Optional try(Stream<String> lines = Files.lines(Paths.get("src/Streams.java"))) { System.out.println(lines.findFirst()); } è  Optional[import java.io.IOException;] Optional<String> findFirst(); Solution: lines.findFirst().get(); èimport java.io.IOException;
  • 47. 47 Interface default methods public interface List<E> extends Collection<E> { default void replaceAll(UnaryOperator<E> operator) { // … } } public interface A { default void foo() { } } public interface B{ default void foo() { } } public class C implements A, B {} // forbidden public class C implements A, B { // allowed public void foo() { } } public static class D implements A, B { // allowed public void foo() { A.super.foo(); } }
  • 48. 48 Interface static methods public interface IntStream { static IntStream empty () { return …; } } IntStream stream = IntStream.empty ();
  • 52. 52 Brian Goetz – State of the lambda http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state- final.html Ninja Squad – Lambda Kata https://github.com/Ninja-Squad/ninjackaton-lambda Maurice Naftalin’s lambda facts and books http://www.lambdafaq.org/   Mastering Lamdbas: Java Programming in a Multicore World Links
  • 53. 53