Java 10 нови функции

Тази статия е част от поредица: • Java 10 LocalVariable Type-Inference

• Подобрения на производителността на Java 10

• Java 10 нови функции (текуща статия)

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 copyList = List.copyOf(someIntList); copyList.add(4); }

Всеки опит за модифициране на такава колекция би довел до изключение по време на изпълнение на java.lang.UnsupportedOperationException .

3.2. toUnmodifyble * ()

java.util.stream.Collectors получават допълнителни методи за събиране на поток в немодифицируем списък , карта или набор :

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

Всеки опит за модифициране на такава колекция би довел до изключение по време на изпълнение на java.lang.UnsupportedOperationException .

4. По избор * .илиElseThrow ()

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 Heap:

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

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

The cacerts keystore, which was initially empty so far, is intended to contain a set of root certificates that can be used to establish trust in the certificate chains used by various security protocols.

As a result, critical security components such as TLS didn't work by default under OpenJDK builds.

With Java 10, Oracle has open-sourced the root certificates in Oracle's Java SE Root CA program in order to make OpenJDK builds more attractive to developers and to reduce the differences between those builds and Oracle JDK builds.

8. Deprecations and Removals

8.1. Command Line Options and Tools

Tool javah has been removed from Java 10 which generated C headers and source files which were required to implement native methods – now, javac -h can be used instead.

policytool was the UI based tool for policy file creation and management. This has now been removed. The user can use simple text editor for performing this operation.

Removed java -Xprofoption. The option was used to profile the running program and send profiling data to standard output. The user should now use jmap tool instead.

8.2. APIs

Deprecated java.security.acl package has been marked forRemoval=true and is subject to removal in a future version of Java SE. It's been replaced by java.security.Policy and related classes.

Similarly, java.security.{Certificate,Identity,IdentityScope,Signer} APIs are marked forRemoval=true.

9. Time-Based Release Versioning

Starting with Java 10, Oracle has moved to the time-based release of Java. This has following implications:

  1. A new Java release every six months. The March 2018 release is JDK 10, the September 2018 release is JDK 11, and so forth. These are called feature releases and are expected to contain at least one or two significant features
  2. Support for the feature release will last only for six months, i.e., until next feature release
  3. Long-term support release will be marked as LTS. Support for such release will be for three years
  4. Java 11 will be an LTS release

java -version will now contain the GA date, making it easier to identify how old the release is:

$ 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. Conclusion

In this article, we saw the new features and changes brought in by Java 10.

Както обикновено, кодови фрагменти могат да бъдат намерени в GitHub.

« Предишни подобрения в производителността на Java 10