JDK 8 WPROWADZENIE DO WYBRANYCH ZAGADNIEŃ



Podobne dokumenty
Programowanie w Javie wykład 8 Interfejsy

Dokumentacja do API Javy.

PROGRAMOWANIE FUNKCYJNE

Programowanie obiektowe

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Java: interfejsy i klasy wewnętrzne

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Klasy abstrakcyjne i interfejsy

Platformy Programistyczne Podstawy języka Java

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

Klasy abstrakcyjne, interfejsy i polimorfizm

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Programowanie obiektowe

Programowanie obiektowe i zdarzeniowe

Wykład 7: Pakiety i Interfejsy

Języki i metody programowania Java INF302W Wykład 2 (część 1)

Na przykładzie języków Java, C# i odrobiny C++ Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Współbieżność w środowisku Java

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Aplikacje w środowisku Java

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Programowanie w Internecie. Java

TYPY GENERYCZNE (GENERICS)

Enkapsulacja, dziedziczenie, polimorfizm

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

Wykład 2: Podstawy Języka

1 Wątki 1. 2 Tworzenie wątków 1. 3 Synchronizacja 3. 4 Dodatki 3. 5 Algorytmy sortowania 4

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Co jeszcze mogą nam dać adnotacje? Adam Warski

Polimorfizm. dr Jarosław Skaruz

Na przykładzie języków Java, C# i odrobiny C++ Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Wywoływanie metod zdalnych

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Programowanie obiektowe zastosowanie języka Java SE

Programowanie obiektowe

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Tabela wewnętrzna - definicja

Programowanie w języku Java WYKŁAD

Typy sparametryzowane

Java podstawy jęyka. Wykład 2. Klasy abstrakcyjne, Interfejsy, Klasy wewnętrzne, Anonimowe klasy wewnętrzne.

Wykład 6: Dziedziczenie

Wykład 8: klasy cz. 4

Programowanie obiektowe

Dawid Gierszewski Adam Hanasko

Dziedziczenie. dr Jarosław Skaruz

Programowanie obiektowe

Kurs programowania. Wykład 9. Wojciech Macyna

Wykład 4: Klasy i Metody

PWSG Ćwiczenia 12. Wszystkie ukończone zadania należy wysłać na adres: lub

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Java Zadanie 1. Aby poprawnie uruchomić aplikację desktopową, należy zaimplementować główną metodę zapewniającą punkt wejścia do programu.

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Wywoływanie metod zdalnych

Zaawansowane aplikacje WWW - laboratorium

Programowanie w Javie wykład 15 Elementy programowania funkcyjnego cd.

Metody Metody, parametry, zwracanie wartości

Wykład 8: Obsługa Wyjątków

API STREAM WYRAŻENIA LAMBDA

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

Język JAVA podstawy. Wykład 4, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Języki Programowania II Wykład 3. Java podstawy. Przypomnienie

1. Co będzie wynikiem wykonania poniŝszych instrukcji? g2d.gettransform().scale(1, -1); g2d.gettransform().translate(4, -8); g2d.drawline(4, 0, 4, 4);

Podejście obiektowe. Tablice obiektów Przykład 1 metody i atrybuty statyczne oraz niestatyczne

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java

1. Co można powiedzieć o poniższym kodzie? public interface I { void m1() {}; static public void m2() {}; void abstract m3();

Wielowątkowość. Programowanie w środowisku rozproszonym. Wykład 1.

Języki i metody programowania Java. Wykład 2 (część 2)

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Technologie i usługi internetowe cz. 2

Programowanie obiektowe

Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.

Programowanie obiektowe

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Remote Method Invocation 17 listopada 2010

Java - wprowadzenie. Programowanie Obiektowe Mateusz Cicheński

Podejście obiektowe do budowy systemów rozproszonych

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

Akademia ETI. Wprowadzenie do programowania w Javie PG Java User Group Przemysław Kulesza

Podejście obiektowe do budowy systemów rozproszonych

Programowanie obiektowe

Realizacja ekstensji klasy. Paulina Strzelecka, Tomasz Roszkowski

dr inż. Piotr Czapiewski Tworzenie aplikacji w języku Java Laboratorium 1

Programowanie w Javie - wykład 14 Podstawy programowania funkcyjnego

Przykład -

Remote Method Invocation 17 listopada rozproszonych. Dariusz Wawrzyniak (IIPP) 1

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

KOTLIN. Język programowania dla Androida

Wykład 5: Więcej o Klasach i Metodach

Transkrypt:

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

AGENDA 1. Co nowego w Javie? 2. Istotne zmiany w interfejsach 3. Wyrażenia Lamdba jako syntactic sugar 4. java.util.stream.stream

WYBRANE NEW FEATURES 101 Generalized Target-Type Inference 103 Parallel Array Sorting 104 Annotations on Java Types 107 Bulk Data Operations for Collections 109 Enhance Core Libraries with Lambda 117 Remove the Annotation-Processing Tool (apt) 120 Repeating Annotations 122 Remove the Permanent Generation 126 Lambda Expressions & Virtual Extension Methods 135 Base64 Encoding & Decoding 150 Date & Time API 153 Launch JavaFX Applications 155 Concurrency Updates 160 Lambda-Form Representation for Method Handles 161 Compact Profiles 162 Prepare for Modularization 174 Nashorn JavaScript Engine 184 HTTP URL Permissions 185 JAXP 1.5: Restrict Fetching of External Resources

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

JAVA 8 POWSTAŁA Z UDZIAŁEM SPOŁECZNOŚCI https://java.net/projects/adoptopenjdk/

2. ISTOTNE ZMIANY W INTERFEJSACH

METODY STATYCZNE W INTERFEJSACH public 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. klas narzędziowych (przykład: java.util.collections dla interfejsu java.util.collection<e>

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

DZIEDZICZENIE METOD DOMYŚLNYCH public 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);

INTERFEJSY FUNKCYJNE @FunctionalInterface public interface Command<T,V> { V execute(t parameter); default void itmaycontainsdefaultmethod() { //...rocket science default Long andanotherdefaultmethodandstillbeafunctionalinterface() { return 20L; @FunctionalInterface - opcjonalnie Każdy interfejs posiadający dokładnie jedną metodę abstrakcyjną jest interfejsem funkcyjnym

A ZATEM INFTERFEJSAMI FUNKCYJNYMI SĄ M.IN. java.lang.runnable java.awt.event.actionlistener java.lang.comparable<t>

JAVA.UTIL.FUNCTION

@FunctionalInterface public interface Function<T, R> { FUNCTION<T, R> R apply(t t); dokonuje przekształcenia wartości typu T na wartość typu R

@FunctionalInterface public interface Predicate<T> { PREDICATE<T> boolean test(t t); test logiczny dla wartości typu T

@FunctionalInterface public interface Consumer<T> { CONSUMER<T> void accept(t t); wykonuje bezwynikową operację na wartości typu T

@FunctionalInterface public interface Supplier<T> { SUPPLIER<T> T get(); dostarcza bezwarunkową wartość typu T

BIFUNCTION<T, U, R> @FunctionalInterface public interface BiFunction<T, U, R> { R apply(t t, U u); analogicznie do Function, z tą różnicą że obsługiwane są dwa argumenty funkcji

BINARYOPERATOR<T> @FunctionalInterface public interface BinaryOperator<T> extends BiFunction<T, T, T> { zwyczajne działanie binarne dla wartości typu T

PRZED JAVA 8 Podobny zbiór interfejsów "funkcyjnych" udostępnia do dawna biblioteka Guava http://code.google.com/p/guavalibraries/wiki/functionalexplained

ZOBACZMY JAK TO WYGLĄDA W PRAKTYCE

3. WYRAŻENIA LAMBDA

Wyrażenie lambda - "syntactic sugar" dla korzystania z interfejsów funkcyjnych () -> { (Integer x, Integer y) -> { return x + y; (Integer x, Integer y) -> { x + y (x,y) -> x + y

(x,y) -> x + y PORÓWNAJMY new Function<Integer,Integer> { @Override public Integer apply(integer x, Integer y) { return x + y; Z

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() ]

Niemniej LAMBDA!= CLOSURE Lamdba 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 modyfikacje wszystkich widocznych zmiennych w ramach powstałej kopii

ALE TO NIE WSZYSTKO Function<Integer, String> tostring = x -> x.tostring(); można zastąpić referencją do metody: Function<Integer, String> tostring = Object::toString;

Przykład referencji do metody statycznej Integer::valueOf Przykład referencji do metody klasy Object::toString Przykład referencji do metody obiektu x::tostring Przykład referencji do konstruktora Object::new

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

4. STREAM API

java.util.stream.stream Nie mylimy z I/O Stream Myślimy o nim jak o jednorazowym leniwym iteratorze public 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()

RODZAJE OPERACJI WYKONYWANYCH NA STRUMIENIU Wyróżniamy dwa rodzaje operacji dla java.util.stream.stream: intermediate (tzw. pośrednia) - nie zamykają strumienia i zwracają nowy strumień zawierający transformację wynikającą ze wskazanej operacji terminal (tzw. kończąca) - operacja, która musi być wykonana jako ostatnia, uruchamiająca zarejestrowane wcześniej transformacje i zwracająca oczekiwany wynik. Po jej zakończeniu, strumień ginie.

PRZYKŁADY OPERACJI POŚREDNICH filter(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<? extends R>> mapper) przekształca każdy element zagnieżdżonych strumieni i zwraca nowy strumień o płaskiej strukturze

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

PRZYKŁADY OPERACJI KOŃCZĄCYCH foreach(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

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

boolean nonematch(predicate<? super T> predicate) zaprzeczenie dla operacji allmatch Optional<T> findfirst() zwraca pierwszy element strumienia Optional<T> findany() zwraca dowolny element strumienia

public class StreamExample { public static void main(string[] args) { List<String> names = Arrays.asList("John","Joe","James","Phillip","Mark","Jasmin List <Integer> result = names.stream().filter(name -> name.startswith("j")).map(string::length).collect(collectors.tolist());

NALEŻY PAMIĘTAĆ O TYM, ŻE: operacje pośrednie na strumieniu łączone są tzw. łańcuch wywołań transformacje strumienia nie modyfikują wejściowej kolekcji, z której został utworzony dopóki nie wywołamy operacji kończącej, żadna transformacja nie zostanie zastosowana próba ponownego wywołania dowolnej operacji kończącej kończy się wyjątkiem Collection.parallelStream() utworzy zrównoleglony strumień (ilość wątków = ilości procesorów)

ZOBACZMY STRUMIENIE W AKCJI

5. CO JESZCZE?

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)

Time API - java.time http://docs.oracle.com/javase/tutorial/datetime/ API wzorowane na popularnej bibliotece Joda-Time czytelne i proste w użyciu API ułatwiające manipulowanie czasem (np. przesunięcia z uwzględnieniem stref czasowych, tworzenie dat na podstawie przesunięć o x dni, tygodni etc.) praktycznie w całości immutable

NA TYM LISTA NOWOŚCI SIĘ NIE KOŃCZY Nashorn JavaScript Engine Java Compact Profiles nowe 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 do czytania z wejścia) Base64 Encoding & Decoding Type Annotations...

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

GDZIE WARTO ZAJRZEĆ? https://github.com/adoptopenjdk/lambda-tutorial http://winterbe.com/posts/2014/03/16/java-8-tutorial/ http://www.techempower.com/blog/2013/03/26/everythingabout-java-8/ http://zeroturnaround.com/rebellabs/java-8-revealedlambdas-default-methods-and-bulk-data-operations/

DZIĘKUJĘ ZA UWAGĘ!