Нововведення в Java 9: розбираємо на прикладах


Дізнайтесь більше про нові кар'єрні можливості в EchoUA. Цікаві проекти, ринкова оплата, гарний колектив. Надсилайте резюме та приєднуйтеся до нас.

Очікується, що нова версія Java 9 вийде вже 27 липня 2017 року. Давайте розберемося, які функції з’являться, і розповімо, навіщо вони потрібні.

Ось список важливих нововведень Java 9 :

  1. JShell.
  2. Immutable List, Set і Map з коробки.
  3. Private методи в інтерфейсах.
  4. Модульна система.
  5. Поліпшення API.
  6. Зміни в try-with-resources.
  7. Реактивне програмування.
  8. Diamond-оператор для анонімних класів.
  9. Додаткові поліпшення в класах.
  10. Поліпшення Stream API.
  11. Розширені анотації @Deprecated.
  12. HTTP/2 клієнт.
  13. API чутливих зображень.
  14. Різне.

За допомогою прикладів розповімо детальніше про ці функції.

JShell

REPL (англ. read-eval-print loop) – система для інтерактивного програмування в консолі. Якщо користувач вводить рядок коду, в консолі з’являється результат його виконання і цей процес повторюється.

Oracle представила новий інструмент “JShell”. Він необхідний для тестування і використання в консолі різних конструкцій, наприклад класів, інтерфейсів, перерахувань, об’єктів, операторів і т. д.

До речі, вже зараз можна завантажити бета-версію JDK 9, скачавши її з офіційного сайту.

Простий приклад роботи з JShell:

G:>jshell| Welcome to JShell -- Version 9 - ea| For an introduction type: /help intro jshell> int a = 10 a ==> 10jshell> System.out.println ("a value = " + a) a value = 10

Незмінні об’єкти List, Set і Map “з коробки”

Oracle представила декілька зручних методів для створення незмінних List, Set, Map і Map.Entry об’єктів без використання додаткових класів

У Java SE 8 і в ранніх версіях ми можемо використати Collections.unmodifiableXXX для створення незмінних об’єктів колекцій. Якщо ми хочемо створити Immutable List, то використовуватимемо Collections.unmodifiableList метод.

Проте це незручно, тому Oracle додала декілька допоміжних методів в інтерфейси List, Set і Map.

List і Set інтерфейси мають of () методи. Приклади їх використання можна побачити нижче:

List immutableList = List.of (); // порожній незмінний списокList immutableList = List.of ("one"," two"," three"); // незмінний список, що містить інформацію

Map має два набори методів: of () методи і ofEntries () методи для створення об’єктів Immutable Map і Map.Entry.

jshell> Map emptyImmutableMap = Map.of () emptyImmutableMap ==> {} // порожнє незмінне отображениеjshell> Map nonemptyImmutableMap = Map.of (1, " one", 2, " two", 3, " three") nonemptyImmutableMap ==> {2=two, 3=three, 1=one} // незмінне відображення

Private-методи в інтерфейсах

У Java 8 ми можемо забезпечувати реалізацію методу в інтерфейсах, використовуючи default і static методи. Проте ми не можемо створювати private методи в інтерфейсах.
Для уникнення нагромадження і надлишку коду Oracle збирається додати private-методи в інтерфейси Java SE 9. Починаючи з дев’ятої версії, ми також зможемо створювати private static-методи в інтерфейсах за допомогою private.

Створення реалізації методу для інтерфейсу за умовчанням:

public interface Card{ private Long createCardID (){ // Реалізація методу відбувається тут. } private static void displayCardDetails (){ // Реалізація методу відбувається тут. }}

Модульна система

Ось деякі з функцій цієї системи:

  • модульна JDK;
  • модульний вихідний код Java;
  • модульні run-time зображення;
  • інкапсуляція внутрішніх API;
  • система модульної платформи.

JDK 9 поставляється із 92 модулями. Ми можемо використати їх або створити свої, наприклад:

module com.foo.bar { }

Кожен модуль має ім’я, пов’язаний код та інші ресурси.

Поліпшення API

Очікується, що в Java SE 9 будуть зроблені поліпшення в частині API. Будуть додано декілька нових класів і методів для зручнішого керування діями операційної системи.
Два нові інтерфейси в Process API:

  • java.lang.ProcessHandle;
  • java.lang.ProcessHandle.Info.

Приклад Process API:

ProcessHandle currentProcess = ProcessHandle.current ();System.out.println ("Current Process Id: = " + currentProcess.getPid());

Тут нами був створений об’єкт типу ProcessHandle для роботи з діями в операційній системі.

Зміни в try-with-resources

Як ми знаємо, в Java SE 7 з’явилася нова конструкція обробки винятків Try-With-Resources для автоматичного керування ресурсами. У Java SE 9 збираються внести декілька змін до цієї конструкції, щоб підвищити читаність.
Приклад в Java SE 7:

void testARM_Before_Java9 () throws IOException{ BufferedReader reader1 = new BufferedReader (new FileReader ("journaldev.txt")); try (BufferedReader reader2 = reader1) { System.out.println (reader2.readLine()); } }

Приклад в Java 9:

void testARM_Java9 () throws IOException{ BufferedReader reader1 = new BufferedReader (new FileReader ("journaldev.txt")); try (reader1) { System.out.println (reader1.readLine()); }}

Можна помітити, що в новій версії, після try не обов’язково оголошувати нову змінну.

Нововведення в CompletableFuture API

У Java 9 Oracle також збирається поліпшити CompletableFuture API для розв’язання проблем, що з’явилися в Java SE 8. У планах додати затримки і тайм-аути, додаткові методи і поліпшити підкласи.

Приклад:

Executor exe = CompletableFuture.delayedExecutor (50l, TimeUnit.SECONDS);

Тут delayedExecutor () – static метод, використовуваний для повернення виконавця, після заданої затримки.

Реактивне програмування

Для тих, хто ще не ознайомлений з парадигмою реактивного програмування, радимо прочитати наш вступ у тему з прикладами.
У Scala, Play, Akka вже були інтегровані reactive streams. Oracle вирішила додати Reactive Streams API в Java SE 9.

Java SE 9 Reactive Streams API – фреймворк для реалізації асинхронних, масштабованих і паралельних додатків з використанням Java.

У Java SE 9 з’являться наступні API:

  • java.util.concurrent.Flow;
  • java.util.concurrent.Flow.Publisher;
  • java.util.concurrent.Flow.Subscriber;
  • java.util.concurrent.Flow.Processor.

Diamond-оператор для анонімних класів

Припустимо, що у нас є клас Box і ми хочемо зробити його анонімним.
Ось як виглядає цей процес в Java 8 :

 Box createBox (T content){ // Треба поставити 'T' тут  return new Box(content) { };}

Хіба не очевидно, що Box має бути типу T? Компілятор у разі неанонімного класу вибрав би потрібний тип, то чому б не зробити те саме з анонімним?

Проблема полягає не у визначальних (англ. non-denotable) типах, які розпізнаються компілятором, а JVM – ні. Такий випадок може бути оброблений компілятором, але питання – як коректно передати його JVM.

Тому Diamond оператор не допускався у використанні з анонімними класами. Тепер це стало можливим.

Ось як це виглядає в Java 9:

class inJava{  Box createBox (T content) { // Java 9 виводить 'T', тому що цей тип означає return new Box<>(content) { }; } Box<?> createCrazyBox (Object content) { List <?> innerList = Arrays.asList (content); // А цей тип не виводиться, оскільки не можемо його позначити:
// return new Box<>(innerList) { }; // Замість цього означаємо той тип, який нам потрібний: return new Box<List<?>>(innerList) { }; }}

Додаткові поліпшення в класах

У Java SE 9 Oracle додала декілька корисних методів в java.util.Optional.
Ось наприклад як працює метод stream:

Stream emp = getEmployee (id);Stream empStream = emp.flatMap (Optional::stream);

Тут використовується метод Optional.stream (), який конвертує все в потік Employee.

Поліпшення Stream API

У новій версії з’являться як мінімум чотири методи java.util.Stream. Як і stream, усі вони будуть стандартними. Найбільш важливими є dropWhile і takeWhile методи.
Якщо Ви знайомі з мовою Scala або функціональним програмуванням, то обов’язково дізнаєтеся про ці методи.

Простий додаток stream:

jshell> Stream.of (1,2,3,4,5,6,7,8,9,10).takeWhile (i -> i < 5 ).forEach (System.out::println);

Розширені анотації @Deprecated

До Java 9 @Deprecated – інтерфейс-маркер. Багато розробників пропонували Oracle поліпшити інформування про застарілі можливості API. Їх почули і додали можливості роботи із застарілими API. Наприклад, з’явилися інструменти для їх аналізу – forRemoval і since.

HTTP/2 клієнт

Oracle планує викотити новий HTTP- клієнт для підтримки протоколів HTTP/2 і WebSocket. Вони замінюють HttpURLConnection API на новий, продуктивніший.
Новий API буде представлений у пакеті “java.net.http”. Він підтримує як синхронний, так і асинхронний режими.

Новий API можна подивитися на офіційному сайті Oracle в розділі документації.
Приклад HTTP/2 Client:

jshell> import java.net.http.*jshell> import static java.net.http.HttpRequest.*jshell> import static java.net.http.HttpResponse.*jshell> URI uri = new URI ("http://rams4java.blogspot.co.uk/2016/05/java-news.html") uri ==> http://rams4java.blogspot.co.uk/2016/05/java-news.htmljshell> HttpResponse response = HttpRequest.create (uri).body (noBody()).GET ().response () response ==> [email protected]> System.out.println ("Response was " + response.body (asString()))

API для зображень з різними дозволами

Oracle планує впровадити новий API для зображень з різними дозволами. Найбільш важливим є інтерфейс MultiResolutionImage доступний в пакеті java.awt.image.

Інші зміни

Крім вищеперелічених змін, очікуються й інші. Ось лише деякі з них:

  1. Зміни в Garbage Collector.
  2. Зміни в API Stack – Walking.
  3. Фільтр вхідних даних серіалізації.
  4. Відключення API аплета.
  5. Зміни конкатенації рядків.
  6. Поліпшення в MethodHandle.
  7. Логування.
  8. Парсер API для Nashorn.
  9. Пошук по JavaDoc.
  10. HTML5 JavaDoc.

Переклад статті “Java 9 Features with Examples”

Київ, Харків, Одеса, Дніпро, Запоріжжя, Кривий Ріг, Вінниця, Херсон, Черкаси, Житомир, Хмельницький, Чернівці, Рівне, Івано-Франківськ, Кременчук, Тернопіль, Луцьк, Ужгород, Кам'янець-Подільський, Стрий - за статистикою саме з цих міст програмісти найбільше переїжджають працювати до Львова. А Ви розглядаєте relocate?


Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *