Wpis z mikrobloga

No siema javowe świry, mam nadzieję, że nie śpicie ( ͡° ͜ʖ ͡°)
Trochę się nudziłem, więc spisałem sobie po krótce czego oczekujemy w Javie9.
Może być fajnie

tl;dr


1. Modularność czyli Project Jigsaw
- Modularny kod. JRE i JDK zostaną zreorganizowane w interoperacyjne moduły. Wprowadzi to możliwość tworzenia aplikacji, które będzie można z łatwością odpalać na małych urządzeniach.
- Posegmentowany code cache - W zasadzie lekki improvement kompilacji. Stos będzie podzielony na 3 segmenty:
- Non-method code trzymany permamentnie w pamięci
- Kod, który ma potencjalnie długi cykl życia (non-profiled code)
- Kod przejściowy (profiled code)
- Skrócenie czasu budowania
- Delikatnie zmieniony tryb deployu dzięki modułom
http://openjdk.java.net/projects/jigsaw/

2. Streamy
O jejku jak się jaram. Jestem pewien że sporo ułatwi w pracy.

Stream takeWhile(Predicate super T predicate);


Jak sama nazwa wskazuje, zbieramy obiekty dopóki nie zostanie spełniony wniosek w predykacie.

Stream dropWhile(Predicate super T predicate);


Analogicznie (Tylko że odwrotnie :P)

static Stream ofNullable(T t)

Zwraca sekwenyjny Stream zawierający jeden element jeśli nie jest nullem, w innym wypadku zwraca pusty Stream.
Widzę jedną poważną zaletę: zamiast pakować filtrowanie po elementach żeby pozbyć się nulli, pewnie będzie można jakoś z tym zakombinować.
Z drugiej strony - możliwe, że będzie to pewne obejście dla Optionali przydatne przy grzebaniu z bazą.
No ale zobaczymy jak to w praktyce wyjdzie.

static Stream iterate(T seed, Predicate super T hasNext, UnaryOperator next)


eeee, co?
A no, to:

Stream.iterate(0, i -> i <= 2137, i -> i+1)...


Gdzieś to już widziałem :D

LocalDate::datesUntil

Zwróci stream dat. Według mnie - super, bardzo często czegoś takiego potrzebowałem.

Collectors

- filtering()

Można przenieść filtrowanie do collectora.
Przykład:

Map> yearToExpensiveExpenses

= purchases.stream()

.collect(groupingBy(Expense::getYear,

filtering(expense -> expense.getAmount() > 1_000, toList())));


- flatMapping()

Teraz będzie można w collectorach użyć spłaszczania(?) do grupowania elementów.
Przykład:

Map>

= expenses.stream()

.collect(groupingBy(Expense::getYear,

flatMapping(expense -> expense.getTags().stream(), toSet())));


3. Usprawnienia Optionali

ifPresentOrElse()

Czyli w zasadzie trochę rozbudowany ifPresent() znany z Optionali z tym, że pozwala nam wywołać akcję na zdarzenie, gdy isPresent zwróciłoby false:

lookupBooking(bookingReference)

.ifPresentOrElse(

this::displayCheckIn,

this::displayMissingBookingPage);


or()

Jako argument przyjmuje funkcję, która zwraca/produkuje Optionala gdy ten nie zostanie wytworzony wcześniej.

Przykład jak to mogłoby działać w Javie8:

Client client =

findClient(companyId)

.orElseGet(() -> lookupCompanyDetails(companyId));


No ok, ale nie dostajemy Optionala.

Rozwiązanie:

Optional client =

findClient(companyId)

.or(() -> lookupCompanyDetails(companyId))


get()

Jest propozycja żeby pozbyć się Optional.get() i zmienić jej nazwę do czegoś innego.
Nie wiadomo czy będzie w Javie9 ta zmiana.

4. G1GC!
Ok ok, bez szału. Wprowadzony w Java7u4. Docelowo jest propozycja żeby był domyślnym GC.
http://openjdk.java.net/jeps/248
http://www.oracle.com/technetwork/tutorials/tutorials-1876574.html

5. Microbenchmarki!
The Java Microbenchmarking Harness wchodzi do Javy jako oficjalne narzędzie do benchmarków.
http://openjdk.java.net/projects/code-tools/jmh/

6. Interfejsy
Wprowadzili już domyślne metody, to teraz będzie można zrobić domyślnie zaimplementowane prywatne metody. W interfejsach...

7. Try-with-resources na efektywnie finalnych zmiennych(WTF? Dobra, po ludzku: try-with-resources on effectively final variables)

8. Operator diamentowy znany z tworzenia np.: kolekcji wprowadzony do anonimowych klas.

9. Pełne wsparcie dla HTTP/2.0 lub inaczej - HTTP/2.
Dodatkowo nowy klient HTTP mający zastąpić HttpUrlConnection, plus wsparcie właśnie HTTP/2 i websocketów.

10. Rozbudowane ProcessAPI (nie pracowałem z nim, nie będę wymyślał czarów. Jeżeli ktoś coś kiedyś działał to byłbym wdzięczny za komentarz)

11. StackWalker - łatwe przemierzanie stacku wątku (coś dla niskopoziomowców)
http://openjdk.java.net/jeps/259

12. Reactive Streams
Reactive programming staje się powoli coraz popularniejszy. Spring też z tym kombinuje: http://docs.spring.io/spring-framework/docs/5.0.0.M1/spring-framework-reference/html/web-reactive.html

Publisher

Tworzy obiekty dla subskrybentów do konsumpcji. Jedyna metoda: subscribe(Subscriber).

------------------

Subscriber

Subskrybuje publishera (zazwyczaj tylko jednego) od którego pobiera obiekty.

------------------

- onSubscription(Subsription)

Pierwszy event do wywołania przez publishera

------------------

- onNext(T)

Pobranie nastepnego obiektu od publishera

------------------

- onError(Throwable)

Pobranie komunikatów błędów

------------------

- onComplete()

Sygnał, że nie ma więcej obiektów które mają dotrzeć do subskrybenta

------------------

Subscription

Połączenie pomiędzy publisherem i subskrybentem.

------------------

- request(long)

Subskrybent może używać tego aby zgłosić zapotrzebowanie na więcej elementów

------------------

- cancel()

Wiadomo

Flow połączenia:
1. Utworzenie Publishera i Subskrybenta
2. Subskrybcja subskrybenta używając Publisher::subscribe
3. Publisher tworzy Subscription i wywołuje Subscriber::onSubscription
4. W pewnym momencie subskrybent wywołuje request(nL) prosząc o n elementów
5. Publisher zaczyna mu je podawać, a ten odbiera je używając onNext(T). Nigdy nie poda więcej niż poproszone n.
6. Publisher może w pewnym momenie wywołać onComplete lub onError
7. Subskrybent może poprosić o następne dane lub zakończyć połączenie wywołując cancel()

13. JShell!
Nie ma co się rozpisywać.
Dodane wsparcie dla REPL(Read-Eval-Print-Loop).
Teraz kiedy będziemy chcieli coś na szybkości sprawdzić nie trzeba będzie pisać nowego testu na chwilę tylko po prostu odpali się konsolę.

14. Collection Factory Methods

List list = List.of("a", "b", "c");

Map mapImmediate = Map.of(

"one", 1,

"two", 2,

"three", 3);

Map mapEntries = Map.ofEntries(

entry("one", 1),

entry("two", 2),

entry("three", 3));


Niby można coś takiego zrobić mniej więcej tak:

Map mapEntries = new HashMap<>() {{

put("one", 1);

put("two", 2);

put("three", 3);

}};


Według mnie fabryka będzie dużo lepszym rozwiązaniem.

15. Chronology, LocalDate oraz OffsetTime będą mogły zwracać epoch seconds, czyli ilość sekund od 1970-01-01T00:00:00Z

16. Matcher::results
Zwraca Stream pasujących wyników do kryterium. Dane podawane są w takiej samej kolejności w jakiej występują w testowanym inpucie

17. Wsparcie dla GTK3, SHA-3(Jeszcze występujące osobno w bibliotekach od BouncyCastle) i TIFF

linki:
http://blog.codefx.org/java/dev/java-9-stream/
http://blog.takipi.com/5-features-in-java-9-that-will-change-how-you-develop-software-and-2-that-wont/
http://iteratrlearning.com/java9/2016/09/05/java9-optional.html
https://www.sitepoint.com/ultimate-guide-to-java-9/
http://download.java.net/java/jdk9/docs/api/java/util/regex/Matcher.html
http://openjdk.java.net/jeps/266
http://www.javaworld.com/article/2878952/java-platform/modularity-in-java-9.html
http://blog.codefx.org/java/dev/features-project-jigsaw-java-9/

API do nowej wersji:
http://download.java.net/java/jdk9/docs/api/index.html

Odliczanie:
http://www.java9countdown.xyz/

#java #programowanie #java9
Wyrewolwerowanyrewolwer - No siema javowe świry, mam nadzieję, że nie śpicie ( ͡° ͜ʖ ...

źródło: comment_UrCR5OL0l8uB4o7e8SLoy3RZnjIDsLRV.jpg

Pobierz
  • 20
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

Try-with-resources na efektywnie finalnych zmiennych(WTF? Dobra, po ludzku: try-with-resources on effectively final variables)


@Wyrewolwerowanyrewolwer: mogłeś też dodac przykład, nie każdy zna :P
O ile dobrze pamiętam:
InputStream someStream = ...;
try
  • Odpowiedz
@sosnnaa: @Wyrewolwerowanyrewolwer:
W scali zawsze denerwowała mnie ta składnia, jakiś czas pisałem, potem znowu nie, i już nie pamiętam jak się połowę rzeczy zapisywało bo wszędzie masa znaków specjalnych, jak jakieś + i - w generic, do tego po skompilowaniu kod scali zmienia się w istne piekło którego nie sposób użyć już z normalnej javy bez dostania raka co ogranicza używanie twojego dzieła w innych projektach, zdecydowanie wolę
  • Odpowiedz
@GotoFinal Fakt, żeby być biegłym w Scali trzeba sporo pisać i sporo czytać kodu. A najlepiej nie pisać równolegle w Javie :P Od półtora roku piszę głównie w Scali i jest sporo wad, ale to jak na razie najczytelniejszy i najzwięźlejszy język którego używałem dłużej.
Nie używałem akurat Scalowego kodu w Javie (tylko odwrotnie), może ogarną coś przy pisaniu nowego kompilatora.
  • Odpowiedz
@bazingaxl: No i? Przecież nie twierdzę że ofert jest dużo tylko że język jest dużo wygodniejszy. Kto chce pracować w Scali to będzie pracować, nie ma wielu programistów i język dość niszowy to jest mało ofert.

Ale ja znam Twoje podejście i chyba możemy tu skończyć dyskusję: bo moim zdaniem to że jest dużo ofert w C++ nie sprawia że chcę pisać w C++, wolałbym już wyjechać na zmywak do
  • Odpowiedz