Статьи

Обновления API в Java SE 11 (18.9)

Java SE 11, которая также называется 18.9 (основана на новой схеме именования, в которой используются год и месяц выпуска), должна быть GA в последнюю неделю сентября. Новый подход к выпуску новой версии JDK часто позволяет создателям языка внедрять новые функции, быстрее обновлять API для сообщества разработчиков.

Часто обновления API остаются незамеченными и подпадают под некоторые серьезные изменения. Поэтому я подумал о перечислении некоторых изменений API, которые будут в Java 11, которых не было в Java 10.

Я использую сборку jdk-11-ea + 16, загруженную отсюда

Character.toString (целое)

Этот метод возвращает строковое представление для заданной кодовой точки Unicode, как показано ниже:

1
2
3
4
jshell> Character.toString(100)
$10 ==> "d"
jshell> Character.toString(66)
$7 ==> "B"

CharacterSequence.compare (java.lang.CharSequence, java.lang.CharSequence)

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

Лексикографически означает словарный порядок или алфавитный порядок.

1
2
3
4
5
6
7
8
jshell> CharSequence.compare("girl", "boy")
$12 ==> 5
 
jshell> CharSequence.compare("girl", "girl")
$13 ==> 0
 
jshell> CharSequence.compare("hello", "world")
$14 ==> -15

Новые API в java.lang.String

повтор (INT)

01
02
03
04
05
06
07
08
09
10
11
12
13
jshell> "**".repeat(5)
$15 ==> "**********"
 
jshell> "**".repeat(-7)
|  Exception java.lang.IllegalArgumentException: count is negative: -7
|        at String.repeat (String.java:3147)
|        at (#16:1)
 
jshell> "**".repeat(0)
$17 ==> ""
 
jshell> "**".repeat(1)
$18 ==> "**"

ISBLANK ()

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
jshell> String msg = "hello"
msg ==> "hello"
 
jshell> msg.isBlank()
$22 ==> false
 
jshell> String msg = ""
msg ==> ""
 
jshell> msg.isBlank()
$24 ==> true
 
jshell> String msg = " "
msg ==> " "
 
jshell> msg.isBlank()
$26 ==> true

strip (), stripTrailing (), stripLeading ()

01
02
03
04
05
06
07
08
09
10
11
12
13
14
jshell> " hello world ".strip()
$29 ==> "hello world"
 
jshell> "hello world    ".strip()
$30 ==> "hello world"
 
jshell> "hello world    ".stripTrailing()
$31 ==> "hello world"
 
jshell> "        hello world    ".stripLeading()
$32 ==> "hello world    "
 
jshell> "    ".strip()
$33 ==> ""

линии ()

01
02
03
04
05
06
07
08
09
10
11
jshell> String content =  "this is a multiline content\nMostly obtained from some file\rwhich we will break into lines\r\nusing the new api"
content ==> "this is a multiline content\nMostly obtained fro ... ines\r\nusing the new api"
 
jshell> content.lines()
$36 ==> java.util.stream.ReferencePipeline$Head@5ec0a365
 
jshell> content.lines().forEach(System.out::println)
this is a multiline content
Mostly obtained from some file
which we will break into lines
using the new api

java.nio.file.Path.of ()

До этого выпуска в java.nio.file.Path не было фабричных методов, в то время как в java.nio.file.Path был один метод. Этот выпуск представляет фабричный метод в java.nio.file.Path который имеет два варианта:
1. Принимает строковое местоположение для ресурса
2. Принимает местоположение URI к ресурсу
Оба они показаны ниже:

1
2
3
4
5
6
7
8
9
jshell> Path uriPath = Path.of(new URI("file:///C:/Program%20Files/Java/jdk-11/release"))
uriPath ==> C:\Program Files\Java\jdk-11\release
 
jshell> Files.readAllLines(uriPath).forEach(System.out::println)
 
jshell> Path filePath = Path.of("..", "release")
filePath ==> ..\release
 
jshell> Files.readAllLines(filePath).forEach(System.out::println)

Pattern.asMatchPredicate ()

Этот API возвращает java.util.function.Predicate который можно использовать для проверки соответствия заданной строки шаблону, скомпилированному с использованием java.util.regex.Pattern

01
02
03
04
05
06
07
08
09
10
11
12
13
14
jshell> Pattern somePattern =  Pattern.compile("\\w+@\\w+[.]com")
somePattern ==> \w+@\w+[.]com
 
jshell> Predicate<String> somePredicate = somePattern.asMatchPredicate()
somePredicate ==> java.util.regex.Pattern$$Lambda$26/0x00000008000d0840@34c4973
 
jshell> somePredicate.test("[email protected]")
$55 ==> false
 
jshell> somePredicate.test("[email protected]")
$56 ==> true
 
jshell> somePredicate.test("sana#@gmail.com")
$57 ==> false

API, связанные с Java EE, а именно Corba, JAXB, JAX WS (веб-службы), удаляются. Клиентская библиотека HTTP, которая находилась в инкубаторе до тех пор, пока Java 10 не была перемещена из инкубатора в собственный модуль java.net.http . Я скоро напишу несколько постов о новом клиенте HTTP.

Опубликовано на Java Code Geeks с разрешения Мохамеда Санауллы, партнера нашей программы JCG . См. Оригинальную статью здесь: Обновления API в Java SE 11 (18.9)

Мнения, высказанные участниками Java Code Geeks, являются их собственными.