47
JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by / / crafted with Szymon Stępniak @wololock reveal.js

JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

JDK 8WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ

by / / crafted with Szymon Stępniak @wololock reveal.js

Page 2: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

ABOUT ME

Software Developer @ Ideazone (Torun, Poland)

Java/Groovy, Grails contributor, TDD-holic

@wololock

Page 3: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

AGENDA1. Co nowego w Javie?2. Istotne zmiany w interfejsach3. Wyrażenia Lamdba jako syntactic sugar4. java.util.stream.Stream

Page 4: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

WYBRANE NEW FEATURES101 Generalized Target-Type Inference103 Parallel Array Sorting104 Annotations on Java Types107 Bulk Data Operations for Collections109 Enhance Core Libraries with Lambda117 Remove the Annotation-Processing Tool (apt)120 Repeating Annotations122 Remove the Permanent Generation126 Lambda Expressions & Virtual Extension Methods135 Base64 Encoding & Decoding150 Date & Time API153 Launch JavaFX Applications155 Concurrency Updates160 Lambda-Form Representation for Method Handles161 Compact Profiles162 Prepare for Modularization174 Nashorn JavaScript Engine184 HTTP URL Permissions185 JAXP 1.5: Restrict Fetching of External Resources

Page 5: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

HTTP://OPENJDK.JAVA.NET/PROJECTS/JDK8/FEATURES

Page 6: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

JAVA 8 POWSTAŁA Z UDZIAŁEMSPOŁECZNOŚCI

https://java.net/projects/adoptopenjdk/

Page 7: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

2. ISTOTNE ZMIANY W INTERFEJSACH

Page 8: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

METODY STATYCZNE W INTERFEJSACHpublic interface InterfaceWithStaticMethod {

public static String itWorks(int number) { return String.format("Works for %d", number); }}

Zastosowanie: implementacja metod statycznych w interfejsie pozwoli zrezygnować z tzw. klasnarzędziowych (przykład: java.util.Collections dla interfejsu java.util.Collection<E>

Page 9: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

METODY DOMYŚLNE W INTERFEJSACH// (stripped down version of the real Iterable.java)public interface Iterable<T> {

Iterator<T> iterator(); // As in prior versions

// example of a new JDK 8 default method default void forEach(Consumer<? super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } }}

Page 10: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

DZIEDZICZENIE METOD DOMYŚLNYCHpublic interface A { default int foo(Integer n) { return n + n; }}

public interface B { default int foo(Integer n) { return n + 2; }}

public class C implements A,B { @Override public int foo(Integer n) { return A.super.foo(n); }}

Page 11: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

INTERFEJSY FUNKCYJNE@FunctionalInterfacepublic interface Command<T,V> { V execute(T parameter);

default void itMayContainsDefaultMethod() { //...rocket science }

default Long andAnotherDefaultMethodAndStillBeAFunctionalInterface() { return 20L; }}

@FunctionalInterface - opcjonalnieKażdy interfejs posiadający dokładnie jedną metodę abstrakcyjną jest interfejsem funkcyjnym

Page 12: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

A ZATEM INFTERFEJSAMI FUNKCYJNYMI SĄ M.IN.java.lang.Runnablejava.awt.event.ActionListenerjava.lang.Comparable<T>

Page 13: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

JAVA.UTIL.FUNCTION

Page 14: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

FUNCTION<T, R>@FunctionalInterfacepublic interface Function<T, R> {

R apply(T t);}

dokonuje przekształcenia wartości typu T na wartość typu R

Page 15: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

PREDICATE<T>@FunctionalInterfacepublic interface Predicate<T> {

boolean test(T t);}

test logiczny dla wartości typu T

Page 16: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

CONSUMER<T>@FunctionalInterfacepublic interface Consumer<T> {

void accept(T t);}

wykonuje bezwynikową operację na wartości typu T

Page 17: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

SUPPLIER<T>@FunctionalInterfacepublic interface Supplier<T> {

T get();}

dostarcza bezwarunkową wartość typu T

Page 18: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

BIFUNCTION<T, U, R>@FunctionalInterfacepublic interface BiFunction<T, U, R> {

R apply(T t, U u);}

analogicznie do Function, z tą różnicą że obsługiwane są dwaargumenty funkcji

Page 19: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

BINARYOPERATOR<T>@FunctionalInterfacepublic interface BinaryOperator<T> extends BiFunction<T, T, T> {}

zwyczajne działanie binarne dla wartości typu T

Page 20: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

PRZED JAVA 8Podobny zbiór interfejsów "funkcyjnych" udostępnia do

dawna biblioteka Guava

http://code.google.com/p/guava-libraries/wiki/FunctionalExplained

Page 21: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

ZOBACZMY JAK TO WYGLĄDA W PRAKTYCE

Page 22: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

3. WYRAŻENIA LAMBDA

Page 23: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

Wyrażenie lambda - "syntactic sugar" dla korzystania zinterfejsów funkcyjnych

() -> {}

(Integer x, Integer y) -> { return x + y; }

(Integer x, Integer y) -> { x + y }

(x,y) -> x + y

Page 24: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

PORÓWNAJMY(x,y) -> x + y

Znew Function<Integer,Integer> { @Override public Integer apply(Integer x, Integer y) { return x + y; }}

Page 25: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

OCZYWISTE SKOJARZENIA Z DOMKNIĘCIAMI//Groovy example:def sqrt = { x -> x * x }

def marshall = { Payment payment -> [ id: payment.id, amount: payment.amount, attempts: payment.history.findAll { attempt -> attempt.succeed() }.size() ]}

Page 26: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

Niemniej

LAMBDA != CLOSURELamdba jako obiekt anonimowy ma dostęp do: pól obiektu w ramach którego jest zdefiniowana, pól

statycznych oraz zmiennych finalnych w zewnętrznym lokalnym zakresie

Domknięcie natomiast tworzy kopię środowiska w momencie deklaracji, pozwalając na modyfikacjewszystkich widocznych zmiennych w ramach powstałej kopii

Page 27: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

ALE TO NIE WSZYSTKOFunction<Integer, String> toString = x -> x.toString();

można zastąpić referencją do metody:Function<Integer, String> toString = Object::toString;

Page 28: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

Przykład referencji do metody statycznej

Integer::valueOfPrzykład referencji do metody klasy

Object::toStringPrzykład referencji do metody obiektu

x::toStringPrzykład referencji do konstruktora

Object::new

Page 29: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

ZOBACZMY TERAZ JAK WYRAŻENIA LAMBDA UPROSZCZĄ NASZ PRZYKŁADWYKORZYSTANIA FUNKCJI

Page 30: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

4. STREAM API

Page 31: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

java.util.stream.Stream

Nie mylimy z I/O Stream

Myślimy o nim jak o jednorazowym leniwym iteratorzepublic class StreamExample { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1,2,3,4,5,6); Stream<Integer> streamOfNumbers = numbers.stream(); }}

Domyślny Stream jest sekwencyjny. Jeśli możemy go jednak zrównoleglić:

stream.parallel()

Page 32: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

RODZAJE OPERACJI WYKONYWANYCH NA STRUMIENIUWyróżniamy dwa rodzaje operacji dla java.util.stream.Stream:

intermediate (tzw. pośrednia) - nie zamykają strumienia izwracają nowy strumień zawierający transformację

wynikającą ze wskazanej operacji

terminal (tzw. kończąca) - operacja, która musi być wykonanajako ostatnia, uruchamiająca zarejestrowane wcześniej

transformacje i zwracająca oczekiwany wynik. Po jejzakończeniu, strumień ginie.

Page 33: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

PRZYKŁADY OPERACJI POŚREDNICHfilter(Predicate<? super T> predicate)

ogranicza zawartość strumienia do obiektów spełniających predykat

map(Function<? super T, ? extends R> mapper)przekształca każdy element strumienia za pomocą przekazanej funkcji

flatMap(Function<? super T, ? extends Stream<? extendsR>> mapper)

przekształca każdy element zagnieżdżonych strumieni i zwraca nowy strumień o płaskiej strukturze

Page 34: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

distinct()ogranicza zawartość strumienia do unikalnych obiektów, stosując Object.equals(Object)

sorted() oraz sorted(Comparator<? super T> comparator)przekształca strumień do postaci posortowanej

peek(Consumer<? super T> action)wykonuje dodatkową akcję z każdym elementem strumienia, bez przekształcania jego postaci

limit(long maxSize)ogranicza strumień do podanego rozmiaru

Page 35: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

PRZYKŁADY OPERACJI KOŃCZĄCYCHforEach(Consumer<? super T> action);

wykonuje akcję z każdym elementem strumienia, zamykając go jednocześnie

reduce(T identity, BinaryOperator<T> accumulator)rozpoczynając z wartością początkową identity wykonuje operację binarną dla każdego elementu

strumienia oraz wartości wcześniej obliczonej

collect(Collector<? super T, A, R> collector)"zbiera" wszystkie elementy pozostające w strumieniu i zwraca je w postaci determinowanej przez

podany Collector

Page 36: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

min(Comparator<? super T> comparator)zwraca najmniejszą wartość z perspektywy wskazanego comparatora

max(Comparator<? super T> comparator)analogicznie jak wyżej, z tą różnicą że zwracana jest największa wartość

boolean anyMatch(Predicate<? super T> predicate)sprawdza, czy w strumieniu znajduje się co najmniej jeden obiekt spełniający predykat

boolean allMatch(Predicate<? super T> predicate)sprawdza, czy wszystkie znajdujące się w strumieniu obiekty spełniają zadany predykat

Page 37: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

boolean noneMatch(Predicate<? super T> predicate)zaprzeczenie dla operacji allMatch

Optional<T> findFirst()zwraca pierwszy element strumienia

Optional<T> findAny()zwraca dowolny element strumienia

Page 38: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

public class StreamExample {

public static void main(String[] args) { List<String> names = Arrays.asList("John","Joe","James","Phillip","Mark","Jasmine"

List <Integer> result = names.stream() .filter(name -> name.startsWith("J")) .map(String::length) .collect(Collectors.toList()); }}

Page 39: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

NALEŻY PAMIĘTAĆ O TYM, ŻE:operacje pośrednie na strumieniu łączone są tzw. łańcuchwywołańtransformacje strumienia nie modyfikują wejściowejkolekcji, z której został utworzonydopóki nie wywołamy operacji kończącej, żadnatransformacja nie zostanie zastosowanapróba ponownego wywołania dowolnej operacji kończącejkończy się wyjątkiemCollection.parallelStream() utworzy zrównoleglonystrumień (ilość wątków = ilości procesorów)

Page 40: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

ZOBACZMY STRUMIENIE W AKCJI

Page 41: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

5. CO JESZCZE?

Page 42: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

java.util.Optional<T>bardziej wysublimowane podejście do ochrony przed NPE

public class StreamExample {

public static void main(String[] args) { Optional<String> optionalName = Optional.of("Lorem Ipsum");

assert optionalName.isPresent() assert optionalName.get().equals("Lorem ipsum")

Optional<String> noName = Optional.of(null); assert optional.orElse("qweasdzxc").equals("qweasdzxc");

//Optional.ifPresent(Consumer<T> consumer) }}

Page 43: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

Time API - java.timehttp://docs.oracle.com/javase/tutorial/datetime/

API wzorowane na popularnej bibliotece Joda-Timeczytelne i proste w użyciu APIułatwiające manipulowanie czasem (np. przesunięcia zuwzględnieniem stref czasowych, tworzenie dat napodstawie przesunięć o x dni, tygodni etc.)praktycznie w całości immutable

Page 44: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

NA TYM LISTA NOWOŚCI SIĘ NIE KOŃCZYNashorn JavaScript EngineJava Compact Profilesnowe metody w standardowym API Java (np.String.join(delimiter, strings...)nowości w Concurrency API (np. CompletableFuture<T>)nowości w IO/NIO API (np. wykorzystanie lambda doczytania z wejścia)Base64 Encoding & DecodingType Annotations......

Page 45: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

ALE O TYM MUSICIE PRZEKONAĆ SIĘ SAMI! :-)

Page 46: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

GDZIE WARTO ZAJRZEĆ?https://github.com/AdoptOpenJDK/lambda-tutorialhttp://winterbe.com/posts/2014/03/16/java-8-tutorial/http://www.techempower.com/blog/2013/03/26/everything-about-java-8/http://zeroturnaround.com/rebellabs/java-8-revealed-lambdas-default-methods-and-bulk-data-operations/

Page 47: JDK 8 - torun.jug.pl...JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ by Szymon Stępniak / @wololock / crafted with reveal.js

DZIĘKUJĘ ZA UWAGĘ!