Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Trotz Java agil entwickeln

Trotz Java agil entwickeln

Mit Version 8 bekommt Java nun endlich auch ein paar funktionale Elemente verpasst. Lambda-Ausdrücke und die damit einhergehende Erweiterung bestehender APIs im JDK ermöglichen kompakteren, besser lesbaren Code zu schreiben, der häufige Aufgaben, beispielsweise das Suchen in einer Liste von Elementen, stark vereinfacht. Verwendet man etwa die neue Streams-API, kann man in vielen Fällen zukünftig auf jede Menge Boilerplate Code (wie etwa Schleifen) verzichten. Darüber hinaus bietet das neue JDK die Möglichkeit, solche Operationen ohne zusätzlichen Programmieraufwand parallel auszuführen. Die Verwendung der neu eingeführten Optional-Klasse hilft häufige Programmierfehler, wie etwa NullPointerExceptions, von vorneherein zu vermeiden.

All diese Sprachelemente sind in keinster Weise neu. Vielmehr sind sie in anderen Programmiersprachen längst (zum Teil schon seit Jahrzehnten) umgesetzt und werden häufig verwendet. Dennoch denken wir, als Entwickler, die hauptsächlich mit Java arbeiten, dass dieses Release einen Quantensprung für Java darstellt, mit dem sich alle Java-Entwickler auseinandersetzen sollten. Endlich kann man auch in Java kurzen, prägnanten, und damit besser lesbaren Code schreiben. Endlich ist es möglich, Funktionen und Prädikate auf einfache Art und Weise ohne unleserliche anonyme Klassen zu formulieren. Das Ergebnis ist weniger Code, weniger Angriffsfläche für Bugs, weniger Komplexität, mehr Spaß bei der Arbeit.

Dieser Workshop bietet anhand von Live-Demos sowie vieler praktischer Übungen die Möglichkeit, die neuen Java-Features selbst zu erleben und auszuprobieren.

Zielgruppe: (Java-)Entwickler

Voraussetzungen zur Teilnahme: Laptop mit installiertem Java 8 und installierter Java-Entwicklungsumgebung (z.B. Eclipse Luna oder IntelliJ IDEA 13.1).

Marc Philipp

October 17, 2014
Tweet

More Decks by Marc Philipp

Other Decks in Programming

Transcript

  1. Trotz  Java  agil  entwickeln  
    David  Burkhart,  Marc  Philipp  
    XP  Days  Germany  2014  

    View Slide

  2. The  Road  to  Lambda...  
    ∞  
    Java  
    16.10.14  
    Java  8  
    2  

    View Slide

  3. 16.10.14  
    Java  8  
    3  
    Intro  

    View Slide

  4. Demo  
    SortierungDemo1-­‐9.java  
    16.10.14  
    Java  8  
    4  

    View Slide

  5. FuncDonal  Interface  
    =  Interface  mit  genau  einer  Methode  
     
    Beispiele:  
    •  Comparator  
    •  Runnable  
    •  Callable  
    •  FileFilter  
    16.10.14  
    Java  8  
    5  

    View Slide

  6. Lambda-­‐Ausdruck    
    =  Kurzschreibweise  einer  anonymen  ImplemenDerung  
     eines  FuncDonal  Interface  
     
    Comparator  comparator  =  new  Comparator()  {  
     @Override  
     public  int  compare(Person  a,  Person  b)  {  
       return  a.getNachname().compareTo(b.getNachname());  
     }  
    };  
     
    Comparator  comparator    
    =  (a,  b)  -­‐>  a.getNachname().compareTo(b.getNachname());  
    16.10.14  
    Java  8  
    6  

    View Slide

  7. Lambda-­‐Schreibweise  
    16.10.14  
    Java  8  
    7  
    Parameterliste   -­‐>   Body  
    (Person  a,  Person  b)   -­‐>   {  
           return  a.getNachname().compareTo(b.getNachname());  
    }  
    (a,  b)   -­‐>   {  
           return  a.getNachname().compareTo(b.getNachname());  
    }  
    (a,  b)   -­‐>   a.getNachname().compareTo(b.getNachname())  
    a   -­‐>   a.getNachname()  
    ()   -­‐>   a.getNachname()  

    View Slide

  8. Methoden-­‐Referenzen  
    16.10.14  
    Java  8  
    8  
    Schema   Beispiel   Äquivalenter  
    Lambda-­‐Ausdruck  
    Klasse::staDscheMethode   Math::abs   x  -­‐>  Math.abs(x)  
    Klasse::instanzMethode   Person::getNachname   p  -­‐>  p.getNachname()  
    variable::instanzMethode   einePerson::getNachname   ()  -­‐>  
    einePerson.getNachname()  
    Klasse::new   Person::new   ()  -­‐>  new  Person()  

    View Slide

  9. Default-­‐Methoden  
    =  An  Interface  deklarierte  Methode  mit  Default-­‐
    ImplemenDerung  
     
    Vorteil:  ImplemenDerungen  müssen  nicht  angepasst  werden  
     
    Beispiele:  
    •  List::sort  
    •  Iterable::forEach  
    •  Comparator::reversed  
    16.10.14  
    Java  8  
    9  

    View Slide

  10. StaDsche  Methoden  in  Interfaces  möglich  
    Beispiel:  
    Comparator.comparing(Person::getNachname);  
    16.10.14  
    Java  8  
    10  

    View Slide

  11. @FunctionalInterface  
    •  AnnotaDon  für  Interfaces  
    •  Compiler  überprüb,  ob  das  Interface  genau  eine  
    abstrakte  Methode  deklariert  
     
    Compile-­‐Fehler:  
    @FunctionalInterface  
    interface  MyInterface  {  
     void  firstMethod();  
     void  secondMethod();  
    }  
    16.10.14  
    Java  8  
    11  
    Invalid  '@FuncDonalInterface'    
    annotaDon;  MyInterface  is  
    not  a  funcDonal  interface  

    View Slide

  12. Fragen  zur  Intro?  
    16.10.14  
    Java  8  
    12  

    View Slide

  13. 16.10.14  
    Java  8  
    13  
    Standard  FuncDonal  Interfaces  
    java.uDl.funcDon  

    View Slide

  14. Vier  Familien  von  FuncDonal  Interfaces  
    16.10.14  
    Java  8  
    14  
    interface  Consumer  {  
       void  accept(T  t);  
    }  
    interface  Predicate  {  
       boolean  test(T  t);  
    }  
    interface  Supplier  {  
       T  get();  
    }  
    interface  Function  {  
       R  apply(T  t);  
    }  

    View Slide

  15. Frage  &  Übung  zu  Supplier  
    16.10.14  
    Java  8  
    15  
    •  SupplierFrage  
    •  SupplierUebung  
    interface  Consumer  {  
       void  accept(T  t);  
    }  
    interface  Function  {  
       R  apply(T  t);  
    }  
    interface  Supplier  {  
       T  get();  
    }  
    interface  Predicate  {  
       boolean  test(T  t);  
    }  

    View Slide

  16. Übung  zu  Consumer  
    16.10.14  
    Java  8  
    16  
    •  ConsumerUebung  
    interface  Consumer  {  
       void  accept(T  t);  
    }  
    interface  Function  {  
       R  apply(T  t);  
    }  
    interface  Predicate  {  
       boolean  test(T  t);  
    }  
    interface  Supplier  {  
       T  get();  
    }  

    View Slide

  17. Übung  zu  Predicate  
    16.10.14  
    Java  8  
    17  
    interface  Consumer  {  
       void  accept(T  t);  
    }  
    interface  Predicate  {  
       boolean  test(T  t);  
    }  
    •  PredicatesUebung  
    interface  Function  {  
       R  apply(T  t);  
    }  
    interface  Supplier  {  
       T  get();  
    }  

    View Slide

  18. Übung  zu  Function  
    16.10.14  
    Java  8  
    18  
    •  FunctionsUebung  
    interface  Consumer  {  
       void  accept(T  t);  
    }  
    interface  Predicate  {  
       boolean  test(T  t);  
    }  
    interface  Function  {  
       R  apply(T  t);  
    }  
    interface  Supplier  {  
       T  get();  
    }  

    View Slide

  19. 16.10.14  
    Java  8  
    19  
    R.I.P.  For-­‐Loop  
    java.uDl.streams  

    View Slide

  20. Demo  
    StreamDemo1Intro.java  
    16.10.14  
    Java  8  
    20  

    View Slide

  21. java.util.stream.Stream  
    16.10.14  
    Java  8  
    21  
    list.stream()   .filter(…)   .map(…)   .sorted()   .forEach(…)  
     
    Bild:  www.flickr.com/photos/ryanwick/2951635488/  
     

    View Slide

  22. java.util.stream.Stream  
    16.10.14  
    Java  8  
    22  
    Create   Intermediate   Intermediate   Intermediate   Terminal  
    •  Lazy  (Auoau  der  Pipeline)  
    •  Liefert  Stream  
    Intermediate    
    •  Stößt  Auswertung  an  
    •  Liefert  Ergebnis  
    Terminal  

    View Slide

  23. PrimiDve  Streams  
    16.10.14  
    Java  8  
    23  
    • IntStream,  LongStream,  DoubleStream  
    Interfaces  
    • min,  max,  sum,  count,  average  
    SummaryStatistics  
    • IntSupplier,  IntConsumer,  IntPredicate,  
    IntFunction  
    • Long…  
    • Double…  
    OperaDonen  

    View Slide

  24. Übung  
    StreamAufgabe1  
    16.10.14  
    Java  8  
    24  

    View Slide

  25. java.util.stream.Stream  
    16.10.14  
    Java  8  
    25  
    Stateless    
    • Jedes  
    Element  wird  
    für  sich  
    betrachtet  
    • filter  
    • map  
    • reduce  
    Stateful    
    • Es  müssen  
    alle  Elemente  
    gesamt  
    betrachtet  
    werden  
    • distinct  
    • sorted  
    Short-­‐
    CircuiDng  
    • Nicht  alle  
    Elemente  
    müssen  
    betrachtet  
    werden  
    • anyMatch  
    • limit  

    View Slide

  26. java.util.stream.Stream  
    •  Sicht  auf  die  Daten    
    –  vgl.  Iterator  
    •  Möglicherweise  unbegrenzt  
    •  Nur  einmal  verwendbar  
    •  SequenDell  oder  parallel  
    16.10.14  
    Java  8  
    26  

    View Slide

  27. Stream  Erzeugen  
    •  collection.stream  
    •  Stream.generate  (Supplier)  
    •  Stream.iterate(seed,  Function)  
    •  stream.parallel  
    •  IntStream.range  
    •  Random.ints  /  Random.longs  /  Random.doubles  
    •  pattern.splitAsStream  
    •  bufferedReader.lines  
    •  jarFile.stream  /  zipFile.stream  
    •  Files.walk  /  Files.list  /  Files.lines  
     
    16.10.14  
    Java  8  
    27  

    View Slide

  28. Abkürzen  
    • limit  
    • skip  
    Konsumieren  
    • forEach  
    • count  
    • findFirst  
    • findAny  
    PrimiDve  
    Streams  
    • mapToInt  
    • mapToLong  
    • mapToDouble  
    16.10.14  
    Java  8  
    28  
    Suchen  
    • filter  
    • anyMatch  
    • allMatch  
    • noneMatch  
    Transformieren  
    • map  
    • flatMap  
    • reduce  
    • collect  
    SorDeren  
    • distinct  
    • sorted  
    • min  
    • max  

    View Slide

  29. java.util.stream.Collectors  
    16.10.14  
    Java  8  
    29  
    •  Erzeugt  Liste  
    •  Varianten:  toSet,  toCollection  
    toList  
    •  String-­‐KonkatenaDon  
    joining    
    •  Erzeugt    Map>  
    •  Keys  über  Function  
    groupingBy  

    View Slide

  30. Übung  
    StreamAufgabe2  
    16.10.14  
    Java  8  
    30  

    View Slide

  31. 16.10.14  
    Java  8  
    31  
    Error:  PizzaNotFoundExcepDon:  message  
         at  ...  
         at  ...  
         at  ...  
         at  ...  
    Caused  by:  java.lang.NullPointerExcepDon  
         at  ...  
         at  ...  
         at  ...  
         at  ...  
    java.uDl.OpDonal  

    View Slide

  32. The  Billion  Dollar  Mistake  
    Tony  Hoare,  Erfinder  von  
    QuickSort,  Turing  Award  
    Winner:  
    I  call  it  my  billion-­‐dollar  
    mistake.  It  was  the  inven?on  
    of  the  null  reference  in  1965.  
     
    Quelle:  
    hxp://qconlondon.com/london-­‐2009/presentaDon/Null
    +References%3A+The+Billion+Dollar+Mistake  
    16.10.14  
    Java  8  
    32  
    Bild:  hxp://en.wikipedia.org/wiki/C._A._R._Hoare  

    View Slide

  33. Problem:  Was  ist  die  SemanDk  von  „null“?  
    Was  kann  map.get(key)  ==  null  bedeuten?  
     
    Mögliche  Antworten:  
    •  Der  key  ist  nicht  in  der  map  enthalten.  
    •  Der  key  ist  enthalten  und  der  zugehörige  Wert  ist  
    null.  
    16.10.14  
    Java  8  
    33  

    View Slide

  34. Übung  
    OptionalAufgabe  
    16.10.14  
    Java  8  
    34  

    View Slide

  35. 16.10.14  
    Java  8  
    35  
    Date/Time-­‐API,  Versuch  #3  
    java.Dme  

    View Slide

  36. java.time  
    •  Immutable  
    •  Threadsafe  (auch  Formaxer!)  
    •  Brücken  zur  alten  Welt  
    – java.util.Date:  from(Instant),  toInstant  
    – java.util.Calendar:  toInstant  
    •  Warum  nicht  Joda-­‐Time?  
    –  hxp://blog.joda.org/2009/11/why-­‐jsr-­‐310-­‐isn-­‐joda-­‐Dme_4941.html  
    16.10.14  
    Java  8  
    36  

    View Slide

  37. java.time  
    16.10.14  
    Java  8  
    37  
    Maschine  
    •  Instant  
    Menschenlesbar  
    •  LocalDate  
    •  LocalTime  
    •  LocalDateTime  
    •  Enum:  
    DayOfWeek  
    •  Enum:  Month  
    •  MonthDay  
    •  Year  
    •  YearMonth  
    Mit  Zeitzonen  
    •  ZonedDateTime  
    •  OffsetDateTime  
    •  OffsetTime  
    java.util.Date   java.util.Calendar  

    View Slide

  38. java.time  
    16.10.14  
    Java  8  
    38  
    Maschine  
    •  Instant  
    Menschenlesbar  
    •  LocalDate  
    •  LocalTime  
    •  LocalDateTime  
    •  Enum:  
    DayOfWeek  
    •  Enum:  Month  
    •  MonthDay  
    •  Year  
    •  YearMonth  
    Mit  Zeitzonen  
    •  ZonedDateTime  
    •  OffsetDateTime  
    •  OffsetTime  
    java.util.Date   java.util.Calendar  
    Where  possible,  it  is  recommended  to  use  a  
    simpler  class  without  a  Dme-­‐zone.  The  
    widespread  use  of  Bme-­‐zones  tends  to  add  
    considerable  complexity  to  an  applicaDon.  

    View Slide

  39. java.time  
    16.10.14  
    Java  8  
    39  
    Duration  
    • Sekunden  
    • Nanosekunden  
    Period  
    • Jahre  
    • Monate  
    • Tage  

    View Slide

  40. Übung  
    DateTimeAufgaben  
    16.10.14  
    Java  8  
    40  

    View Slide

  41. Stoff  für  einen  weiteren  Workshop...  
    •  Java  FX  8  
    •  Concurrency  Verbesserungen  (CompletableFuture,  ...)  
    •  Nashorn  Javascript  Engine  
    •  Java  7  Features,  die  untergegangen  sind:  
    –  try-­‐with-­‐resources,  MulD-­‐Catch  
    –  NIO2  (java.nio.file.*)    
    16.10.14  
    Java  8  
    41  

    View Slide

  42. Links  
    Download  
    •  hxp://www.oracle.com/technetwork/java/javase/downloads/index.html  
     
    Eclipse-­‐Support  
    •  hxp://www.eclipse.org/downloads/java8/  
     
    JavaDoc  
    •  hxp://download.java.net/jdk8/docs/api/java/uDl/funcDon/package-­‐summary.html  
    •  hxp://download.java.net/jdk8/docs/api/java/uDl/stream/package-­‐summary.html  
    •  hxp://download.java.net/jdk8/docs/api/java/uDl/stream/Stream.html  
    •  hxp://download.java.net/jdk8/docs/api/java/Dme/package-­‐summary.html  
    16.10.14  
    Java  8  
    42  

    View Slide

  43. 16.10.14  
    Java  8  
    43  
    Take  it  for  a  spin...  
    hxp://www.flickr.com/photos/lelik/247277980  
    David  Burkhart  
    Mail  [email protected]  
     
     
    Marc  Philipp  
    Mail  [email protected]  
    TwiGer  @marcphilipp  
    Blog  marcphilipp.de  

    View Slide