%title%
- Java JDK 11 wreszcie wersją LTS
- Nowe metody w klasie String
- Nowe mody do pracy z plikami
- Ułatwiona konwersja z kolekcji do tablicy
- Warunek Not w predykatach
- Var w wyrażeniach lambda
- HTTP Client
- Wydajność
- Dalsze odchudzanie JDK
- Podsumowanie
Java JDK 11 wreszcie wersją LTS
Java 11 została oznaczona jako wersja LTS (ang. Long Term Support), co w praktyce sprawia, iż jest ona faktycznym następcą Java 8. Dzieje się tak dlatego, iż większość większych firm woli opierać swój software na bibliotekach, których autorzy zapewniają długie i najlepiej bezpłatne wsparcie. Jest to szczególnie ważne dla wszelkiego rodzaju instytucji finansowych oraz publicznych, gdzie kładzie się nacisk na bezpieczeństwo aplikacji.
Dotąd polityka firmy Oracle opierała się na udostępnianiu wszelkiego poprawek, mających na celu likwidację luk bezpieczeństwa za darmo. Oczywiście nie wszystkie wersje Java były cały czas wspierane, raczej skupiano się na wersjach najnowszych. W ten sposób łatano JDK 7 aż do 2019, a JDK 8 aż do marca 2022. Dodatkowo Oracle umożliwiał wykupienie dalszego rozszerzonego wsparcia o kolejne lata do niektórych wersji (np. płatne łatki do JDK 7 pojawiać się będą do czerwca 2022).
Od wersji 8 Oracle podzielił wydawane wersje na tzw. LTS i non-LTS, gdzie te drugie wspierane są przez zaledwie pół roku. Dlatego właśnie większość programistów skupia się przede wszystkim na wersjach LTS, traktując non-LTS bardziej jako patch do poprzedniej JDK z rozszerzonym wsparciem. Od Java 11 nastąpiła kolejna zmiana. Jakiekolwiek wsparcie dla Oracle JDK, będzie płatne w formie subskrypcji. Nie jest to jednak problem, bowiem na Oracle JDK opiera się darmowa Open JDK.
Mówiąc wprost, jeżeli zależy Ci na bezpieczeństwie i potrzebujesz rozszerzonego wsparcia ze strony programistów Java, wybierasz wersje Oracle JDK, jeżeli wystarczy Ci aktualizacja raz na pół roku (co tyle wychodzi nowa wersja) to możesz śmiało korzystać z Open JDK. jeżeli dopiero się uczysz programować, nie ma to znaczenia, bowiem licencja nie obowiązuje w przypadku użytkowania prywatnego. Ostatnia ważna zmiana, jeżeli używałeś wcześniej Java JRE (Runtime Environment), np. do odpalenia starych aplikacji, to niestety muszę Cię zmartwić bo JRE nie będzie już wydawane (tylko JDK).
Nowe metody w klasie String
W Java 11 JDK największą zmianą pod względem samego języka, jest stworzenie nowego API dla Stringów. Dodane metody powinny znacznie ułatwić manipulację danymi tekstowymi. Oto one:
lines – przekształca String w strumień, dzieląc go po liniach
repeat – powiela String podaną liczbę razy
strip – usuwa początkowe i końcowe spacje
stripLeading – usuwa tylko wiodące spacje
stripTrailing – usuwa tylko końcowe spacje
isBlank – zwraca prawdę, gdy natrafi na element który jest pusty lub zawiera białe spacje
String text = "I am \n developeronthego.pl \n \nreader."; List<String> lines = text.lines() .filter(Predicate.not(String::isBlank)) .map(String::strip) .collect(Collectors.toList()); String title = " developeronthego.pl "; System.out.println(title.repeat(2)); System.out.println(title.stripLeading()); System.out.println(title.stripTrailing());Nowe mody do pracy z plikami
Programiści Javy wreszcie udostępnili łatwe w użytku metody do tworzenia i wczytywaniu plików. We wcześniejszych wersjach często wymagało to przynajmniej kilku linii kodu. Tymczasem teraz nowe implementacje pozwalają na praktycznie jednolinijkowy zapis.
Path filePath = Files.writeString(Path.of("note.txt"), "My new note on blog."); Files.readString(filePath);Ułatwiona konwersja z kolekcji do tablicy
Mała zmiana zaszła w kolekcjach. Uproszczono znacznie konwersję na tablicę. od dzisiaj można wykorzystać zapisu znanego z Java 8 (reference method) bez wpisywania długości tablicy.
List<String> examples = Arrays.asList("Developer", "on", "the", "go"); examples.toArray(new String[examples.size()]); // old way examples.toArray(String[]::new); // JDK 11Warunek Not w predykatach
Od Java 11 istnieje możliwość odwracania wyniku wyrażeń, zwracających wartości logiczne, które później mogły być wykorzystywane w predykatach. Upraszcza to często strukturę samego streamu.
List<String> sampleList = Arrays.asList("Ala", "ma", "kota", " "); String withoutBlanks = sampleList.stream() .filter(Predicate.not(String::isBlank)) .collect(Collectors.joining(","));W wyniku dostajesz złączony napis, bez zbędnego elementu zawierającego spację (warunek isBlank).
Var w wyrażeniach lambda
Java 11 udoskonaliła odrobinę działanie zmiennych typu var, które weszły w skład JDK w wersji 10.
Predicate<String> predicate = a -> true; // old Predicate<String> varPredicate = (var a) -> true; // newJak widzisz teraz można podstawić var przed lambdą. Pewnie zadasz pytanie: ale adekwatnie to po co? Dzięki takiemu zapisowi można postawić przed wyrażeniem lambda adnotację (np. popularne w bibliotece Lombok** nullchecki typu @Nonnull).
HTTP Client
Eksperymentalny nowy klient HTTP, który był już dostępny w JDK 9. W Java 11 można już korzystać z niego oficjalnie.
HttpClient httpClient = HttpClient.newBuilder() .version(HttpClient.Version.HTTP_2) .connectTimeout(Duration.ofSeconds(10)) .build(); try { HttpRequest request = HttpRequest.newBuilder() .GET() .uri(URI.create("https://developeronthego.pl")) .build(); HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println("Status code: " + response.statusCode()); } catch (IOException | InterruptedException e) { e.printStackTrace(); }Wydajność
W kolejnym wydaniu JDK oczywiście nie mogło zabraknąć poprawienia wydajności samej platformy.
- Dodano nowy Garbage Collector o nazwie Epsilon (na razie jako feature eksperymentalny)
- Ulepsz istniejące wewnętrzne mechanizmy ciągów i tablic oraz zaimplementuj nowe mechanizmy wewnętrzne dla funkcji sin, cos i log java.lang.Math na procesorach AArch64
- Dodano opcjonalne wsparcie dla nowego algorytmu obsługi puli stałych o nazwie CONSTANT_Dynamic
- Udostępniono za darmo Java Flight Recorder (nowy profiler)
Dalsze odchudzanie JDK
Podążając ścieżką wytyczoną przez technologie mikroserwisowe, Oracle ostatecznie usunął moduły Java EE oraz Corba, które od Javy 9 były ustawione jako deprecated. Oznacza to, iż w Java 11 nie uświadczymy następujących bibliotek:
- java.xml.ws: Java API for XML Web Services (JAX-WS), Web Services Metadata for the Java Platform, and SOAP with Attachments for Java (SAAJ)
- java.xml.bind: Java Architecture for XML Binding (JAXB)
- java.xml.ws.annotation
- java.corba: CORBA
- java.transaction: Transaction Services
- java.activation: JavaBeans Activation Framework
- java.se.ee: Aggregator
- jdk.xml.ws: narzędzia dla JAX-WS
- jdk.xml.bind: narzędzia dla JAXB
Podsumowanie
Java 11 stanowi zwieńczenie wszystkich zmian pomiędzy wersjami 9 i 11. Większość z nich dotyczy drobnych usprawnień (głównie w streamach) oraz dodanie długo wyczekiwanych zmiennych var. Można też zauważyć tendencję do odchudzania JDK o mało używane feature’y.
**Popularna biblioteka w Javie: https://projectlombok.org/
Kod do lekcji na jest dostępny na moim githubie.