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 с временной привязкой. Это имеет следующие последствия:
- Новый выпуск Java каждые шесть месяцев. Выпуск за март 2018 г. — JDK 10, выпуск за сентябрь 2018 г. — JDK 11 и так далее. Они называются выпусками функций, и ожидается, что они будут содержать по крайней мере одну или две важные функции.
- Поддержка выпуска функции продлится только в течение шести месяцев , т. е. до следующего выпуска функции.
- Выпуск с долгосрочной поддержкой будет помечен как LTS. Поддержка такого релиза будет в течение трех лет
- 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 .