Перейти к основному содержимому

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

· 4 мин. чтения

1. Введение

JDK 10 , представляющий собой реализацию Java SE 10, был выпущен 20 марта 2018 года.

В этой статье мы рассмотрим и рассмотрим новые функции и изменения, представленные в JDK 10.

2. Вывод типа локальной переменной

Перейдите по ссылке для подробной статьи об этой функции:

Вывод типа локальной переменной Java 10

3. Неизменяемые коллекции

В Java 10 есть несколько изменений, связанных с немодифицируемыми коллекциями.

3.1. копия()

java.util.List , java.util.Map и java.util.Set получили новый статический метод copyOf(Collection) .

Он возвращает неизменяемую копию данной коллекции:

@Test(expected = UnsupportedOperationException.class)
public void whenModifyCopyOfList_thenThrowsException() {
List<Integer> copyList = List.copyOf(someIntList);
copyList.add(4);
}

Любая попытка изменить такую коллекцию приведет к исключению времени выполнения java.lang.UnsupportedOperationException .

3.2. toНемодифицируемый*()

java.util.stream.Collectors получает дополнительные методы для сбора Stream в неизменяемый List , Map или Set :

@Test(expected = UnsupportedOperationException.class)
public void whenModifyToUnmodifiableList_thenThrowsException() {
List<Integer> evenList = someIntList.stream()
.filter(i -> i % 2 == 0)
.collect(Collectors.toUnmodifiableList());
evenList.add(4);
}

Любая попытка изменить такую коллекцию приведет к исключению времени выполнения java.lang.UnsupportedOperationException .

4. Необязательный *.orElseThrow()

java.util.Optional , java.util.OptionalDouble , java.util.OptionalInt и java.util.OptionalLong получили новый метод orElseThrow() , который не принимает никаких аргументов и генерирует исключение NoSuchElementException , если значение отсутствует:

@Test
public void whenListContainsInteger_OrElseThrowReturnsInteger() {
Integer firstEven = someIntList.stream()
.filter(i -> i % 2 == 0)
.findFirst()
.orElseThrow();
is(firstEven).equals(Integer.valueOf(2));
}

Это синоним и теперь является предпочтительной альтернативой существующему методу get() .

5. Улучшения производительности

Перейдите по ссылке для подробной статьи об этой функции:

Улучшения производительности Java 10

6. Осведомленность о контейнерах

JVM теперь знают, что они запускаются в контейнере Docker, и будут извлекать конфигурацию, специфичную для контейнера, вместо того, чтобы запрашивать саму операционную систему — это относится к таким данным, как количество ЦП и общий объем памяти, выделенной для контейнера.

Однако эта поддержка доступна только для платформ на базе Linux. Эта новая поддержка включена по умолчанию и может быть отключена в командной строке с параметром JVM:

-XX:-UseContainerSupport

Кроме того, это изменение добавляет параметр JVM, который позволяет указать количество процессоров, которые будет использовать JVM:

-XX:ActiveProcessorCount=count

Кроме того, были добавлены три новых параметра JVM, которые позволяют пользователям контейнера Docker получить более детальный контроль над объемом системной памяти, которая будет использоваться для кучи Java:

-XX:InitialRAMPercentage
-XX:MaxRAMPercentage
-XX:MinRAMPercentage

7. Корневые сертификаты

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

В результате важные компоненты безопасности, такие как TLS, по умолчанию не работали в сборках OpenJDK.

В Java 10 Oracle открыл исходный код корневых сертификатов в программе Oracle Java SE Root CA, чтобы сделать сборки OpenJDK более привлекательными для разработчиков и уменьшить различия между этими сборками и сборками Oracle JDK.

8. Прекращение поддержки и удаление

8.1. Параметры и инструменты командной строки

Инструмент javah был удален из Java 10, который генерировал заголовки C и исходные файлы, необходимые для реализации нативных методов — теперь вместо него можно использовать javac -h .

policytool был инструментом на основе пользовательского интерфейса для создания и управления файлами политик. Сейчас это удалено. Пользователь может использовать простой текстовый редактор для выполнения этой операции.

Удалена опция java -Xprof . Опция использовалась для профилирования работающей программы и отправки данных профилирования на стандартный вывод. Вместо этого пользователь должен использовать инструмент jmap .

8.2. API

Устаревший пакет java.security.acl помечен forRemoval=true и подлежит удалению в будущей версии Java SE. Он был заменен java.security.Policy и связанными с ним классами.

Точно так же API java.security.{Certificate,Identity,IdentityScope,Signer} помечаются forRemoval=true .

9. Версии выпуска на основе времени

Начиная с Java 10, Oracle перешла на версию Java с временной привязкой. Это имеет следующие последствия:

  1. Новый выпуск Java каждые шесть месяцев. Выпуск за март 2018 г. — JDK 10, выпуск за сентябрь 2018 г. — JDK 11 и так далее. Они называются выпусками функций, и ожидается, что они будут содержать по крайней мере одну или две важные функции.
  2. Поддержка выпуска функции продлится только в течение шести месяцев , т. е. до следующего выпуска функции.
  3. Выпуск с долгосрочной поддержкой будет помечен как LTS. Поддержка такого релиза будет в течение трех лет
  4. Java 11 будет выпуском LTS

java -version теперь будет содержать дату GA , что упрощает определение возраста выпуска:

$ java -version
openjdk version "10" 2018-03-20
OpenJDK Runtime Environment 18.3 (build 10+46)
OpenJDK 64-Bit Server VM 18.3 (build 10+46, mixed mode)

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

В этой статье мы увидели новые функции и изменения, внесенные в Java 10.

Как обычно, фрагменты кода можно найти на GitHub .