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).

956c7d246841e8507a1e1b96842994db?s=128

Marc Philipp

October 17, 2014
Tweet

Transcript

  1. 5.

    FuncDonal  Interface   =  Interface  mit  genau  einer  Methode  

      Beispiele:   •  Comparator   •  Runnable   •  Callable   •  FileFilter   16.10.14   Java  8   5  
  2. 6.

    Lambda-­‐Ausdruck     =  Kurzschreibweise  einer  anonymen  ImplemenDerung    eines

     FuncDonal  Interface     Comparator<Person>  comparator  =  new  Comparator<Person>()  {    @Override    public  int  compare(Person  a,  Person  b)  {      return  a.getNachname().compareTo(b.getNachname());    }   };     Comparator<Person>  comparator     =  (a,  b)  -­‐>  a.getNachname().compareTo(b.getNachname());   16.10.14   Java  8   6  
  3. 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()  
  4. 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()  
  5. 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  
  6. 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  
  7. 14.

    Vier  Familien  von  FuncDonal  Interfaces   16.10.14   Java  8

      14   interface  Consumer<T>  {      void  accept(T  t);   }   interface  Predicate<T>  {      boolean  test(T  t);   }   interface  Supplier<T>  {      T  get();   }   interface  Function<T,R>  {      R  apply(T  t);   }  
  8. 15.

    Frage  &  Übung  zu  Supplier   16.10.14   Java  8

      15   •  SupplierFrage   •  SupplierUebung   interface  Consumer<T>  {      void  accept(T  t);   }   interface  Function<T,R>  {      R  apply(T  t);   }   interface  Supplier<T>  {      T  get();   }   interface  Predicate<T>  {      boolean  test(T  t);   }  
  9. 16.

    Übung  zu  Consumer   16.10.14   Java  8   16

      •  ConsumerUebung   interface  Consumer<T>  {      void  accept(T  t);   }   interface  Function<T,R>  {      R  apply(T  t);   }   interface  Predicate<T>  {      boolean  test(T  t);   }   interface  Supplier<T>  {      T  get();   }  
  10. 17.

    Übung  zu  Predicate   16.10.14   Java  8   17

      interface  Consumer<T>  {      void  accept(T  t);   }   interface  Predicate<T>  {      boolean  test(T  t);   }   •  PredicatesUebung   interface  Function<T,R>  {      R  apply(T  t);   }   interface  Supplier<T>  {      T  get();   }  
  11. 18.

    Übung  zu  Function   16.10.14   Java  8   18

      •  FunctionsUebung   interface  Consumer<T>  {      void  accept(T  t);   }   interface  Predicate<T>  {      boolean  test(T  t);   }   interface  Function<T,R>  {      R  apply(T  t);   }   interface  Supplier<T>  {      T  get();   }  
  12. 21.

    java.util.stream.Stream   16.10.14   Java  8   21   list.stream()

      .filter(…)   .map(…)   .sorted()   .forEach(…)     Bild:  www.flickr.com/photos/ryanwick/2951635488/    
  13. 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  
  14. 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  
  15. 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  
  16. 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  
  17. 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  
  18. 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  
  19. 29.

    java.util.stream.Collectors   16.10.14   Java  8   29   • 

    Erzeugt  Liste   •  Varianten:  toSet,  toCollection   toList   •  String-­‐KonkatenaDon   joining     •  Erzeugt    Map<K,  List<V>>   •  Keys  über  Function<V,  K>   groupingBy  
  20. 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<T>  
  21. 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  
  22. 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  
  23. 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  
  24. 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  
  25. 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.  
  26. 39.

    java.time   16.10.14   Java  8   39   Duration

      • Sekunden   • Nanosekunden   Period   • Jahre   • Monate   • Tage  
  27. 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  
  28. 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  
  29. 43.

    16.10.14   Java  8   43   Take  it  for

     a  spin...   hxp://www.flickr.com/photos/lelik/247277980   David  Burkhart   Mail  david.burkhart@andrena.de       Marc  Philipp   Mail  marc.philipp@andrena.de   TwiGer  @marcphilipp   Blog  marcphilipp.de