Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
© Henri Tremblay 2015
Henri Tremblay
Senior Software Engineer
Terracotta, a Software AG company
Learn Java 8: Lambdas and ...
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 ...
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 fi...
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);
}
I...
24
Auto Closeable
Before
InputStream in = new FileInputStream("allo.txt");
try {
// … do stuff
} finally {
try { in.close(...
25
File IO API
List<String> lines =
Files.readAllLines(
Paths.get("path", "to", "my", "file.txt"));
// also: file watcher,...
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...
29
Date / Time API
Core ideas:
  Immutable
  A time is a time, a date is a date. Not always both (like java.util.Date)
  N...
30
Date / Time API (example)
LocalDateTime now = LocalDateTime.now();
String thatSpecialDay = now
.withDayOfMonth(1)
.atZo...
31
Nashorn
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;...
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 abst...
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));...
39
Implicit final
List<String> list = new ArrayList<>();
String greeting = "Hello "; // no final required
list.forEach(s -...
40
Everything is a lambda
public interface MyInterface {
int foo();
}
public void bar(MyInterface i) {
System.out.println(...
41
Method references
public static class Passenger {
public void inboard(Train train) {
System.out.println("Inboard " + tr...
42
Upside Down
public class MethodTest {
public class Foo {
static final String ERR_MESSAGE = "bad";
public void doIt() th...
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"))
....
45
Parallel
List<String> list = new ArrayList<>();
int sum = list
.parallelStream()
.filter(s -> s.startsWith("a"))
.mapTo...
46
Optional
try(Stream<String> lines =
Files.lines(Paths.get("src/Streams.java"))) {
System.out.println(lines.findFirst())...
47
Interface default methods
public interface List<E> extends
Collection<E> {
default void replaceAll(UnaryOperator<E>
ope...
48
Interface static methods
public interface IntStream {
static IntStream empty () {
return …;
}
}
IntStream stream = IntS...
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 – ...
53
54
Questions? http://montreal-jug.org
? http://easymock.org
http://objenesis.org
http:/ehcache.org
Henri Tremblay
http://b...
Upcoming SlideShare
Loading in …5
×

JavaOne 2016 - Learn Lambda and functional programming

279 views

Published on

This tutorial walks through tons of examples. You will learn everything you need to know about lambdas and functional programming in Java 8. I'm the supplier. You’re the consumer (and you will get the joke after the session).

Published in: Technology
  • I didn't think it was possible to buy a reliable car for under $500. WOW! I own my car for the same price as other people's monthly payment. ✤✤✤ https://bit.ly/3h0ICqP
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • My son was struggling with GCSE revision and being a typical boy his desire to stay inside and study was not too high on the agenda! His maths has always been pretty average, and he has always had very little confidence in his mathematical abilities. Jeevan's programme is excellent. The break down of all mathematical problems has completely changed the way my son approaches his work and he is no longer doubting his ability. I have no doubt that this programme is the best there is and would have complete confidence in recommending it to anyone studying GCSE maths. On a side note, Jeevan is a perfect gentleman. He is very approachable, kind and generous with his advice. An efficient young man who truly cares about what he is offering. If you purchase this programme, you will certainly not be disappointed. ●●● http://ishbv.com/jeevan91/pdf
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Be the first to like this

JavaOne 2016 - Learn Lambda and functional programming

  1. 1. © Henri Tremblay 2015 Henri Tremblay Senior Software Engineer Terracotta, a Software AG company Learn Java 8: Lambdas and Functional Programming [TUT6198] @henri_tremblay
  2. 2. 2 Henri Tremblay
  3. 3. 3 Henri Tremblay
  4. 4. 4 Henri Tremblay •  More or less made possible class mocking and proxying •  Coined the term “partial mocking”
  5. 5. 5 Henri Tremblay •  More or less made possible class mocking and proxying •  Coined the term “partial mocking”
  6. 6. 6
  7. 7. 7 Java < 8
  8. 8. 8 Live Coding
  9. 9. 9 8 minutes break (please do come back)
  10. 10. 10 More Live Coding
  11. 11. 11 Questions
  12. 12. 12 You voting for me
  13. 13. 13 Java 5 (2004)
  14. 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. 15 Type witness MyClass.<List<String>> anyObject() because you can’t (List<String>) MyClass.anyObject()
  16. 16. 16 Java 6 (2006, last from Sun)
  17. 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. 18 Java 7 (2011, first from Oracle)
  19. 19. 19 JAVA 7 BROUGHT A LOT OF SYNTACTIC SUGAR (plus invokeDynamic, forkJoin, better file IO)
  20. 20. 20 Switch for strings switch(s) { case "hello": return "world"; case "bonjour": return "le monde"; }
  21. 21. 21 Diamond operator List<String> list = new ArrayList<>();
  22. 22. 22 Binary integer literals and underscores int i = 0b1110001111; int i = 1_000_000;
  23. 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. 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. 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. 26. 26 Java 8 (2014)
  27. 27. 27 JAVA 8: LAMBDA! (and also a new date API, default methods, metaspace, Nashorn, JavaFX and CompletableFuture)
  28. 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. 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. 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. 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. 32
  33. 33. 33 Lambda: 11th letter of the Greek alphabet
  34. 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. 35 This is a function: This is a lambda: Lambda calculus
  36. 36. 36 c = sqrt(add(pow(a, 2), pow(b, 2))) Functional programming
  37. 37. 37
  38. 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. 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. 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. 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. 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. 43. 43 Streams try(Stream<String> lines = Files.lines(Paths.get("src/Streams.java"))) { System.out.println(lines.findFirst()); }
  44. 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. 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. 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. 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. 48 Interface static methods public interface IntStream { static IntStream empty () { return …; } } IntStream stream = IntStream.empty ();
  49. 49. 49 Break! (8 minutes)
  50. 50. 50 The End
  51. 51. 51 Who has learned something today? ?
  52. 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. 53
  54. 54. 54 Questions? http://montreal-jug.org ? http://easymock.org http://objenesis.org http:/ehcache.org Henri Tremblay http://blog.tremblay.pro @henri_tremblay

×