Рубрики
Без рубрики

Новые функции в Java 11

Java 11 предоставляет новые функции, включая удобные методы в стандартных библиотеках и интеграцию нового HTTP-клиента. Мы рассмотрим эти и другие улучшения.

Автор оригинала: baeldung.

1. Обзор

Oracle выпустила Java 11 в сентябре 2018 года, всего через 6 месяцев после своей предшественницы, версии 10.

Java 11 является первым выпуском долгосрочной поддержки (LTS) после Java 8. Oracle также прекратила поддержку Java 8 в январе 2019 года. Как следствие, многие из нас перейдут на Java 11.

В этом уроке мы рассмотрим наши варианты выбора JDK Java 11. Затем мы рассмотрим новые функции, удаленные функции и улучшения производительности, представленные в Java 11.

2. Оракул против Откройте JDK

Java 10 была последним бесплатным выпуском Oracle JDK, который мы могли использовать в коммерческих целях без лицензии. Начиная с Java 11, от Oracle нет бесплатной долгосрочной поддержки (LTS).

К счастью, Oracle продолжает предоставлять OpenJDK релизы, которые мы можем скачивать и использовать бесплатно.

Помимо Oracle, существуют другие поставщики открытых JDK, которые мы можем рассмотреть.

3. Функции разработчика

Давайте рассмотрим изменения в общих API, а также некоторые другие функции, полезные для разработчиков.

3.1. Новые строковые Методы

Java 11 добавляет несколько новых методов в Строку класс : Пусто , строки , полоса , ведущая полоса , завершающая полоса/| и повтор .

Давайте проверим, как мы можем использовать новые методы для извлечения непустых, разделенных строк из многострочной строки:

String multilineString = "Baeldung helps \n \n developers \n explore Java.";
List lines = multilineString.lines()
  .filter(line -> !line.isBlank())
  .map(String::strip)
  .collect(Collectors.toList());
assertThat(lines).containsExactly("Baeldung helps", "developers", "explore Java.");

Эти методы могут уменьшить количество шаблонов, связанных с манипулированием строковыми объектами, и избавить нас от необходимости импортировать библиотеки.

В случае методов strip они обеспечивают функциональность, аналогичную более знакомому методу trim . Однако с более тонким управлением и поддержкой Юникода.

3.2. Новые Методы обработки файлов

Теперь стало проще читать и записывать Строки из файлов.

Мы можем использовать новый Строка чтения и Запись статические методы из Файлы класс:

Path filePath = Files.writeString(Files.createTempFile(tempDir, "demo", ".txt"), "Sample text");
String fileContent = Files.readString(filePath);
assertThat(fileContent).isEqualTo("Sample text");

3.3. Сбор в массив

Файл java.util.Коллекция интерфейс содержит новый метод по умолчанию toArray , который принимает аргумент Int функции .

Это облегчает создание массива нужного типа из коллекции:

List sampleList = Arrays.asList("Java", "Kotlin");
String[] sampleArray = sampleList.toArray(String[]::new);
assertThat(sampleArray).containsExactly("Java", "Kotlin");

3.4. Метод Не Предиката

В интерфейс Предиката добавлен статический не метод . Мы можем использовать его для отрицания существующего предиката, подобно методу negate :

List sampleList = Arrays.asList("Java", "\n \n", "Kotlin", " ");
List withoutBlanks = sampleList.stream()
  .filter(Predicate.not(String::isBlank))
  .collect(Collectors.toList());
assertThat(withoutBlanks).containsExactly("Java", "Kotlin");

Пока нет(isBlank) читается более естественно, чем isBlank .отрицать() , большим преимуществом является то, что мы также можем использовать нет со ссылками на методы, например нет(Строка:isBlank) .

3.5. Синтаксис локальной переменной для Лямбда

Поддержка использования синтаксиса локальной переменной ( ключевое слово var ) в параметрах лямбда была добавлена в Java 11.

Мы можем использовать эту функцию для применения модификаторов к нашим локальным переменным, например, для определения аннотации типа:

List sampleList = Arrays.asList("Java", "Kotlin");
String resultString = sampleList.stream()
  .map((@Nonnull var x) -> x.toUpperCase())
  .collect(Collectors.joining(", "));
assertThat(resultString).isEqualTo("JAVA, KOTLIN");

3.6. HTTP-клиент

Новый HTTP – клиент из пакета java.net.http был представлен в Java 9. Теперь это стало стандартной функцией в Java 11.

Новый HTTP API повышает общую производительность и обеспечивает поддержку как HTTP/1.1, так и HTTP/2:

HttpClient httpClient = HttpClient.newBuilder()
  .version(HttpClient.Version.HTTP_2)
  .connectTimeout(Duration.ofSeconds(20))
  .build();
HttpRequest httpRequest = HttpRequest.newBuilder()
  .GET()
  .uri(URI.create("http://localhost:" + port))
  .build();
HttpResponse httpResponse = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());
assertThat(httpResponse.body()).isEqualTo("Hello from the server!");

3.7. Управление Доступом На Основе Гнезд

Java 11 вводит понятие оценки и связанные с ними правила доступа в JVM.

Гнездо классов в Java подразумевает как внешний/основной класс, так и все его вложенные классы:

assertThat(MainClass.class.isNestmateOf(MainClass.NestedClass.class)).isTrue();

Вложенные классы связаны с атрибутом Члены гнезда , в то время как внешний класс связан с атрибутом Узел гнезда :

assertThat(MainClass.NestedClass.class.getNestHost()).isEqualTo(MainClass.class);

Правила доступа JVM разрешают доступ к закрытым участникам между соседями по гнезду. Однако в предыдущих версиях Java API отражения отказывал в том же доступе.

Java 11 устраняет эту проблему и предоставляет средства для запроса атрибутов нового файла класса с помощью API отражения:

Set nestedMembers = Arrays.stream(MainClass.NestedClass.class.getNestMembers())
  .map(Class::getName)
  .collect(Collectors.toSet());
assertThat(nestedMembers).contains(MainClass.class.getName(), MainClass.NestedClass.class.getName());

3.8. Запуск Java-Файлов

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

$ javac HelloWorld.java
$ java HelloWorld 
Hello Java 8!

Вместо этого мы можем напрямую запустить файл с помощью команды java :

$ java HelloWorld.java
Hello Java 11!

4. Повышение Производительности

Давайте теперь рассмотрим пару новых функций, основной целью которых является повышение производительности.

4.1. Динамические константы Файлов Классов

Формат файла класса Java расширен для поддержки новой формы пула констант с именем CONSTANT_Dynamic .

Загрузка нового пула констант делегирует создание методу начальной загрузки, так же как связывание invokedynamic сайта вызова делегирует связь с методом начальной загрузки.

Эта функция повышает производительность и предназначена для разработчиков языков и разработчиков компиляторов.

4.2. Улучшенные Встроенные Функции Aarch64

Java 11 оптимизирует существующие встроенные функции строк и массивов на процессорах ARM64 или AArch64. Кроме того, новые встроенные функции реализованы для sin, cos, и log методов java.lang.Математика .

Мы используем внутреннюю функцию, как и любую другую. Однако внутренняя функция обрабатывается компилятором особым образом. Он использует ассемблерный код, специфичный для архитектуры процессора, для повышения производительности.

4.3. Сборщик Мусора Без Операций

Новый сборщик мусора под названием Epsilon доступен для использования в Java 11 в качестве экспериментальной функции.

Он называется No-Op (без операций), потому что он выделяет память, но на самом деле не собирает мусор. Таким образом, Эпсилон применим для моделирования ошибок нехватки памяти.

Очевидно, что Epsilon не подойдет для типичного производственного Java-приложения. Однако есть несколько конкретных случаев использования, когда это может быть полезно:

  • Тестирование производительности
  • Проверка давления в памяти
  • Тестирование интерфейса виртуальной машины и
  • Чрезвычайно недолговечные рабочие места

Чтобы включить его, используйте флаг -XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC .

4.4. Бортовой самописец

Java Flight Recorder (JFR) теперь с открытым исходным кодом в OpenJDK , где раньше он был коммерческим продуктом в Oracle JDK. JFR-это инструмент профилирования, который мы можем использовать для сбора данных диагностики и профилирования из запущенного Java-приложения.

Чтобы начать 120-секундную запись JFR, мы можем использовать следующий параметр:

-XX:StartFlightRecording=duration=120s,settings=profile,filename=java-demo-app.jfr

Мы можем использовать OFF в производстве, так как его накладные расходы на производительность обычно ниже 1%. По истечении этого времени мы сможем получить доступ к записанным данным, сохраненным в файле JFR.

Однако для анализа и визуализации данных нам необходимо использовать другой инструмент, называемый JDK Mission Control (JMC).

5. Удаленные и устаревшие модули

По мере развития Java мы больше не можем использовать какие-либо из ее удаленных функций и должны прекратить использование любых устаревших функций. Давайте быстро взглянем на наиболее заметные из них.

5.1. Java EE и CORBA

Автономные версии технологий Java EE доступны на сторонних сайтах. Поэтому нет необходимости в том, чтобы Java SE включал их.

Java 9 уже устарела для выбранных модулей Java EE и CORBA. В выпуске 11 он теперь полностью удален:

  • Java API для веб-службы на основе XML s (java.xml.ws )
  • Архитектура Java для привязки XML (java.xml.bind )
  • Платформа активации JavaBeans (java.активация )
  • Общие аннотации (javax.xml.ws.аннотации )
  • Архитектура брокера запросов на общие объекты (java.corba)
  • API транзакций Java (java.transaction )

5.2. JMC и JavaFX

Система управления полетами JDK (JMC) больше не включена в JDK. Автономная версия JMC теперь доступна для отдельной загрузки.

То же самое верно и для модулей JavaFX. JavaFX будет доступен в виде отдельного набора модулей за пределами JDK.

5.3. Устаревшие Модули

Кроме того, в Java 11 устарели следующие модули:

  • Движок Nashorn JavaScript, включая инструмент JJS
  • Схема сжатия Pack200 для файлов JAR

6. Различные изменения

Java 11 внесла еще несколько изменений, о которых важно упомянуть:

  • Новые реализации шифров ChaCha20 и ChaCha20-Poly1305 заменяют небезопасный потоковый шифр RC4
  • Поддержка соглашения о криптографическом ключе с Curve25519 и Curve448 заменяет существующую схему ECDH
  • Повышенная безопасность транспортного уровня (TLS) до версии 1.3 обеспечивает повышение безопасности и производительности
  • Введен сборщик мусора с низкой задержкой GC в качестве экспериментальной функции с низким временем паузы
  • Поддержка Unicode 10 добавляет больше символов, символов и смайликов

7. Заключение

В этой статье мы рассмотрели некоторые новые функции Java 11.

Мы рассмотрели различия между Oracle и OpenJDK. Кроме того, мы рассмотрели изменения API, а также другие полезные функции разработки, улучшения производительности и удаленные или устаревшие модули.

Как всегда, исходный код доступен на GitHub .