Поиск по сайту:

Возможности Java 9 с примерами


Java 9 — это основной выпуск, который принес нам множество возможностей для разработчиков. В этой статье мы подробно рассмотрим возможности Java 9.

Выпущена Java 10. Полный обзор выпуска Java 10 см. в разделе Возможности Java 10.

Особенности Java 9

  1. Java 9 REPL (JShell)
  2. Фабричные методы для Immutable List, Set, Map и Map.Entry
  3. Закрытые методы в интерфейсах
  4. Модульная система Java 9
  5. Улучшения API процесса
  6. Попробуйте с улучшением ресурсов
  7. Улучшения API CompletableFuture
  8. Реактивные потоки
  9. Оператор Diamond для анонимного внутреннего класса
  10. Необязательные улучшения класса
  11. Улучшения Stream API
  12. Расширенная аннотация @Deprecated
  13. Клиент HTTP 2
  14. API изображений с несколькими разрешениями
  15. Различные возможности Java 9

Корпорация Oracle собирается выпустить Java SE 9 примерно в конце марта 2017 года. В этом посте я собираюсь кратко обсудить «Функции Java 9» с некоторыми примерами.

Java 9 REPL (JShell)

Oracle Corp представила новый инструмент под названием \jshell. Он расшифровывается как Java Shell и также известен как REPL (Read Evaluate Print Loop). Он используется для выполнения и тестирования любых конструкций Java, таких как класс, интерфейс, перечисление, объект, операторы. и т. д. очень легко Мы можем загрузить программное обеспечение JDK 9 EA (Early Access) с https://jdk9.java.net/download/

G:\>jshell
|  Welcome to JShell -- Version 9-ea
|  For an introduction type: /help intro


jshell> int a = 10
a ==> 10

jshell> System.out.println("a value = " + a )
a value = 10

Если вы хотите узнать больше об инструменте REPL, ознакомьтесь с функциями Java 9 REPL (часть 2).

Фабричные методы для неизменяемых списков, наборов, карт и карт. Запись

Корпорация Oracle представила несколько удобных фабричных методов для создания объектов Immutable List, Set, Map и Map.Entry. Эти служебные методы используются для создания пустых или непустых объектов Collection. В Java SE 8 и более ранних версиях мы можем использовать служебные методы класса Collections, такие как unmodifiedXXX, для создания объектов Immutable Collection. Например, если мы хотим создать неизменяемый список, мы можем использовать метод Collections.unmodifiableList. Однако эти методы Collections.unmodifiableXXX являются утомительным и многословным подходом. Чтобы преодолеть эти недостатки, Oracle Corp добавила несколько служебных методов в интерфейсы List, Set и Map. Интерфейсы List и Set имеют методы \of() для создания пустых или непустых объектов Immutable List или Set, как показано ниже: Пример пустого списка

List immutableList = List.of();

Пример непустого списка

List immutableList = List.of("one","two","three");

Карта имеет два набора методов: методы of() и методы ofEntries() для создания объекта Immutable Map и объекта Immutable 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}

Если вы хотите узнать больше об этих служебных методах, перейдите по следующим ссылкам:

  • Фабричные методы Java 9 для неизменяемого списка
  • Фабричные методы Java 9 для неизменяемого множества
  • Фабричные методы Java 9 для неизменной карты и Map.Entry

Приватные методы в интерфейсах

В Java 8 мы можем обеспечить реализацию метода в интерфейсах, используя методы по умолчанию и статические методы. Однако мы не можем создавать частные методы в интерфейсах. Чтобы избежать избыточного кода и повысить удобство повторного использования, Oracle Corp собирается представить закрытые методы в интерфейсах Java SE 9. Начиная с Java SE 9, мы также можем писать частные и частные статические методы в интерфейсе, используя ключевое слово «private». Эти частные методы похожи только на другие частные методы класса, между ними нет никакой разницы.

public interface Card{

  private Long createCardID(){
    // Method implementation goes here.
  }

  private static void displayCardDetails(){
    // Method implementation goes here.
  }

}

Если вы хотите узнать больше об этой новой функции, перейдите по этой ссылке: Частные методы Java 9 в интерфейсе.

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

Одним из больших изменений или особенностей Java 9 является модульная система. Oracle Corp собирается представить следующие функции в рамках проекта Jigsaw.

  • Модульный JDK
  • Модульный исходный код Java
  • Модульные образы времени выполнения
  • Инкапсулировать внутренние API Java
  • Система модулей платформы Java

До версий Java SE 9 мы использовали Monolithic Jars для разработки приложений на основе Java. Эта архитектура имеет много ограничений и недостатков. Чтобы избежать всех этих недостатков, Java SE 9 поставляется с системой модулей. JDK 9 поставляется с 92 модулями (могут измениться в финальной версии). Мы можем использовать модули JDK, а также можем создавать свои собственные модули, как показано ниже: Пример простого модуля

module com.foo.bar { }

Здесь мы используем «модуль» для создания простого модуля. У каждого модуля есть имя, соответствующий код и другие ресурсы. Чтобы узнать больше об этой новой архитектуре и практическом опыте, ознакомьтесь с моими оригинальными руководствами здесь:

  • Основы модульной системы Java 9
  • Примеры модуля Java 9 с использованием командной строки
  • Пример модуля Hello World Java 9 с использованием Eclipse IDE

Усовершенствования API процесса

Java SE 9 поставляется с некоторыми улучшениями в Process API. Они добавили пару новых классов и методов, чтобы упростить контроль и управление процессами ОС. Два новых интерфейса в Process API:

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

Пример API процесса

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

Попробуйте с улучшением ресурсов

Мы знаем, что в 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());
 }
}

Чтобы узнать больше об этой новой функции, ознакомьтесь с моим оригинальным руководством по адресу: Java 9 Try-With-Resources Improvements

Улучшения CompletableFuture API

В Java SE 9 корпорация Oracle собирается улучшить CompletableFuture API для решения некоторых проблем, возникших в Java SE 8. Они собираются добавить поддержку некоторых задержек и тайм-аутов, некоторых служебных методов и улучшенного подкласса.

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

Здесь delayedExecutor() — это статический служебный метод, используемый для возврата нового Executor, который отправляет задачу исполнителю по умолчанию после заданной задержки.

Реактивные потоки

В настоящее время реактивное программирование стало очень популярным в разработке приложений, чтобы получить некоторые прекрасные преимущества. Scala, Play, Akka и т. д. Фреймворки уже интегрировали Reactive Streams и получают множество преимуществ. Oracle Corps также представляет новый API Reactive Streams в Java SE 9. Java SE 9 Reactive Streams API — это платформа публикации/подписки, позволяющая очень легко реализовывать асинхронные, масштабируемые и параллельные приложения с использованием языка Java. В Java SE 9 представлен следующий API для разработки реактивных потоков в приложениях на основе Java.

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

Подробнее читайте в Java 9 Reactive Streams.

Алмазный оператор для анонимного внутреннего класса

Мы знаем, что в Java SE 7 появилась одна новая функция: Diamond Operator, чтобы избежать избыточного кода и многословия, чтобы улучшить читаемость. Однако в Java SE 8 корпорация Oracle (разработчик библиотеки Java) обнаружила некоторые ограничения в использовании оператора Diamond с анонимным внутренним классом. Они исправили эти проблемы и собираются выпустить их как часть Java 9.

  public List getEmployee(String empid){
     // Code to get Employee details from Data Store
     return new List(emp){ };
  }

Здесь мы используем просто \Список без указания параметра типа.

Необязательные улучшения класса

В Java SE 9 корпорация Oracle добавила несколько новых полезных методов в класс java.util.Optional. Здесь я собираюсь обсудить один из этих методов на простом примере: потоковый метод. Если значение присутствует в заданном необязательном объекте, этот метод stream() возвращает последовательный поток с этим значением. В противном случае он возвращает пустой поток. Они добавили метод «stream()» для ленивой работы с необязательными объектами, как показано ниже:

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

Здесь метод Optional.stream() используется для преобразования объекта Stream of Optional of Employee в Stream of Employee, чтобы мы могли лениво работать с этим результатом в коде результата. Чтобы узнать больше об этой функции с дополнительными примерами и прочитать о новых методах, добавленных в дополнительный класс, ознакомьтесь с моим исходным руководством по адресу: Java SE 9: дополнительные улучшения класса.

Улучшения потокового API

В Java SE 9 корпорация Oracle добавила четыре полезных новых метода в интерфейс java.util.Stream. Поскольку Stream — это интерфейс, все эти новые реализованные методы являются методами по умолчанию. Два из них очень важны: методы dropWhile и takeWhile. Если вы знакомы с языком Scala или любым языком программирования функций, вы обязательно знаете об этих методах. Это очень полезные методы при написании кода функционального стиля. Давайте обсудим служебный метод takeWhile здесь. Этот метод takeWhile() принимает предикат в качестве аргумента и возвращает поток подмножества заданных значений потока до тех пор, пока этот предикат не вернет false в первый раз. Если первое значение НЕ удовлетворяет этому предикату, оно просто возвращает пустой поток.

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

Чтобы узнать больше о методах takeWhile и dropWhile и других новых методах, ознакомьтесь с моим исходным руководством по адресу: Java SE 9: улучшения Stream API.

Расширенная аннотация @Deprecated

В Java SE 8 и более ранних версиях аннотация @Deprecated для предоставления дополнительной информации об устаревшем API, а также для предоставления инструмента для анализа статического использования приложением устаревших API. Они добавили два метода в этот устаревший интерфейс: forRemoval и с тех пор, чтобы обслуживать эту информацию.

HTTP2-клиент

В Java SE 9 корпорация Oracle собирается выпустить новый клиентский API HTTP 2 для поддержки протокола HTTP/2 и функций WebSocket. Поскольку существующий или устаревший HTTP-клиентский API имеет множество проблем (например, поддерживает протокол HTTP/1.1 и не поддерживает протокол HTTP/2 и WebSocket, работает только в режиме блокировки и имеет множество проблем с производительностью), они заменяют этот HttpURLConnection API новым HTTP. клиент. Они собираются представить новый клиентский API HTTP 2 в пакете \java.net.http. Он поддерживает протоколы HTTP/1.1 и HTTP/2. Он поддерживает как синхронный (режим блокировки), так и асинхронный режимы. Он поддерживает асинхронный Режим с использованием API WebSocket. Мы можем увидеть этот новый API по адресу https://download.java.net/java/jdk9/docs/api/java/net/http/package-summary.html Пример клиента HTTP 2.

jshell> import java.net.http.*

jshell> import static java.net.http.HttpRequest.*

jshell> import static java.net.http.HttpResponse.*

jshell> URI uri = new URI("https://rams4java.blogspot.co.uk/2016/05/java-news.html")
uri ==> https://rams4java.blogspot.co.uk/2016/05/java-news.html

jshell> HttpResponse response = HttpRequest.create(uri).body(noBody()).GET().response()
response ==> java.net.http.HttpResponseImpl@79efed2d

jshell> System.out.println("Response was " + response.body(asString()))

Пожалуйста, просмотрите мой оригинальный учебник по адресу: Java SE 9: HTTP 2 Client, чтобы понять протокол HTTP/2 и WebSocket, преимущества нового API и недостатки OLD API с некоторыми полезными примерами.

API изображений с несколькими разрешениями

В Java SE 9 корпорация Oracle собирается представить новый API изображений с несколькими разрешениями. Важным интерфейсом в этом API является MultiResolutionImage. Он доступен в пакете java.awt.image. MultiResolutionImage инкапсулирует набор изображений с разной высотой и шириной (то есть с разными разрешениями) и позволяет нам запрашивать их в соответствии с нашими требованиями.

Разные возможности Java 9

В этом разделе я просто перечислю некоторые новые возможности Java SE 9. Я НЕ говорю, что это менее важные функции. Они также важны и полезны, чтобы понять их очень хорошо с некоторыми полезными примерами. На данный момент я не получил достаточно информации об этих функциях. Вот почему я собираюсь перечислить их здесь для краткого понимания. Я выберу эти функции одну за другой и добавлю в приведенный выше раздел краткое обсуждение и пример. И, наконец, написать отдельный учебник позже.

  • Улучшения GC (сборщика мусора)
  • API обхода стека
  • Фильтрация входящих данных сериализации
  • Прекращение поддержки Applet API
  • Указать конкатенацию строк
  • Расширенные дескрипторы методов
  • API и служба ведения журналов платформы Java
  • Компактные строки
  • API парсера для Nashorn
  • Поиск Javadoc
  • HTML5 Javadoc

Я буду поднимать эти функции java 9 одну за другой и обновлять их с достаточным количеством описаний и примеров. Это все о возможностях Java 9 вкратце с примерами.