來源:開源中國
www.oschina.net/news/98314/java-11-api-changes-so-far
自從上個月進入“減速(ramp-down)”階段以來,JDK 11 的特性已經處於凍結狀態。這些重大的變化已被列為 JEP(JDK Enhancement Proposal 特性增強提議)。此外,JDK 11 中也有很多除 JEP 之外的變化,但官方尚未總結。因此,本文將列出我所知道的 JDK 11 中的 API 變更。
String
lines()
字串實體方法,使用專門的 Spliterator 來懶惰地提供源字串中的行
jshell> “test
hoge
“.lines().map(String::toUpperCase).toArray()$11 ==> Object[2] { “TEST”, “HOGE” }
repeat(int)
按照引數 int 提供的次數來重覆字串的執行次數
jshell> “test”.repeat(3)
$7 ==> “testtesttest”
isBlank()
驗證當前字串是否為空,或者是否只包括空白字元(空白字元由 Character.isWhiteSpace(int) 驗證)
jshell> var halfSpace = ” “
halfSpace ==> ” “
jshell> halfSpace.isBlank()
$11 ==> true
jshell> var fullSpace = “ ”
fullSpace ==> “ ”
jshell> fullSpace.isBlank()
$13 ==> true
strip()/stripLeading()/stripTrailing()
這三個方法的作用分別是去掉字串頭和尾的空白符、字串頭的空白符、字串尾的空白符,基本與 trim()/trimLeft()/trimRight() 方法相同,不過它們的空白字元由 Character.isWhiteSpace(int) 驗證
jshell> var aaa = fullSpace + “aaa” + fullSpace
aaa ==> “ aaa ”
jshell> aaa.strip()
$14 ==> “aaa”
jshell> aaa.trim()
$15 ==> “ aaa ”
CharSequence
compare(CharSequence, CharSequence)
按字典順序進行排序
它被 CharSequence/StringBuffer/StringBuilder 中的 compareTo() 使用。因此,這三個類都實現了 Comparable。
Character
toString(int)
JDK 11 使這個過程變得更加方便
JDK10.0.1
jshell> Character.toString(65)
| Error:
| incompatible types: possible lossy conversion from int to char
| Character.toString(65)
|
JDK11ea14
jshell> Character.toString(65)
$9 ==> “A”
Path
of(String, String…)
此前我們需要使用 Paths.get()。現在,我們像其他類一樣使用 of()。
Files
writeString(Path, CharSequence)
我們可以使用該方法來儲存一個 String 字串。
jshell> Files.writeString(Path.of(“test.txt”), “Hello!!!”)
$3 ==> test.txt
readString(Path)
我們可以使用該方法來讀取一個 String 字串。
jshell> Files.readString(Path.of(“test.txt”))
$4 ==> “Hello!!!”
Reader
nullReader()
使用該方法,我們可以得到一個不執行任何操作的 Reader。
Writer
nullWriter()
使用該方法,我們可以得到一個不執行任何操作的 Writer。
InputStream
nullInputStream()
使用該方法,我們可以得到一個不執行任何操作的 InputStream。
OutputStream
nullOutputStream()
使用該方法,我們可以得到一個不執行任何操作的 OutputStream。
Predicate
not(Predicate)
此前在需要反轉條件的地方,我們選擇不使用方法取用。現在相反,我們可以使用方法取用。
jshell> Stream.of(“aa”, “”, “bb”).filter(Predicate.not(String::isEmpty)).toArray()
$23 ==> Object[2] { “aa”, “bb” }
Collection
toArray(IntFunction)
此前,我們需要使用像 list.toArray(new String) 這樣的無風格標記(non-stylish notation)來從一個集合建立一個型別化陣列。現在,我們可以以風格標記(stylish notation)的方式進行編寫。
jshell> List.of(“aa”,”bb”).toArray(String[]::new)
$1 ==> String[2] { “aa”, “bb” }
Optional/OptionalInt/OptionalLong/OptionalDouble
isEmpty()
isPresent() 方法此前已經存在,現在我們使用 isEmpty() 方法。
jshell> Optional.ofNullable(null).isEmpty()
$5 ==> true
TimeUnit
convert(Duration)
該方法已經新增到 java.util.concurrent.TimeUnit 中。
Pattern
asMatchPredicate()
到目前為止,只有 asPredicate() 方法,但現在我們還擁有 asMatchPredicate() 方法。
jshell> var pred = Pattern.compile(“aaa”).asPredicate()
pred ==> java.util.regex.Pattern$Lambda$25/0x00000008000b5040@2f686d1f
jshell> pred.test(“aaa”)
$6 ==> true
jshell> pred.test(“aaab”)
$7 ==> true
jshell> var matPred = Pattern.compile(“aaa”).asMatchPredicate()
matP ==> java.util.regex.Pattern$Lambda$24/0x00000008000b6440@402a079c
jshell> matPred.test(“aaa”)
$9 ==> true
jshell> matPred.test(“aaab”)
$10 ==> false
ListSelectionModel
已新增 getSelectedIndices() / getSelectedCount() 方法
Thread
destroy()/stop(Throwable)
移除 destroy() 方法,保留 stop() 方法。
Policy
已移除 javax.security.auth.Policy。
ArrayIndexOutOfBoundsException
丟擲的異常資訊已修改:
JDK10.0.1
jshell> new int[]{}[0]
| java.lang.ArrayIndexOutOfBoundsException thrown: 0
| at (#8:1)
JDK11ea14
jshell> new int[]{}[0]
| Exception java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0
| at (#4:1)
IndexOutOfBoundsException
在本次變更中,已在異常資訊中移除 hyphens。
JDK10.0.1
jshell> List.of().get(0)
| java.lang.IndexOutOfBoundsException thrown: Index 0 out-of-bounds for length 0
| at Preconditions.outOfBounds (Preconditions.java:64)
| at Preconditions.outOfBoundsCheckIndex (Preconditions.java:70)
| at Preconditions.checkIndex (Preconditions.java:248)
| at Objects.checkIndex (Objects.java:372)
| at ImmutableCollections$List0.get (ImmutableCollections.java:106)
| at (#6:1)
JDK11ea14
jshell> List.of().get(0)
| Exception java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0
| at ImmutableCollections$ListN.get (ImmutableCollections.java:411)
| at (#3:1)
System
arraycopy
JDK10
jshell> System.arraycopy(new int[0],0,new double[0],0,0)
| java.lang.ArrayStoreException thrown
JDK11ea19
jshell> System.arraycopy(new int[0], 0, new double[0], 0, 0)
| Exception java.lang.ArrayStoreException: arraycopy: type mismatch: can not copy int[] into double[]
setProperty(String, String)
之前改變 java.home 會導致一些問題,現在問題已得到解決。
支援 Japanese New Era
Japanese Imperial Era 計劃於 2019.5.1 改用新的規則。
本次變更是作為 NewEra 佔位符引入的。
在日本政府宣佈之後,它將在 JDK 12.0.1 中進行更新。
JDK10.0.1
jshell> JapaneseDate.of(2019, 5, 1)
$15 ==> Japanese Heisei 31-05-01
JDK11 ea18
jshell> JapaneseDate.of(2019, 5, 1)
$3 ==> Japanese NewEra 1-05-01
目前我們還未能將 May 1st Heisei 31 作為我們的 JapaneseDate。
JDK10.0.1
jshell> JapaneseDate.of(JapaneseEra.HEISEI, 31, 5, 1)
$14 ==> Japanese Heisei 31-05-01
JDK11 ea18
jshell> JapaneseDate.of(JapaneseEra.HEISEI, 31, 5, 1)
| Exception java.time.DateTimeException: year, month, and day not valid for Era
| at JapaneseDate.of (JapaneseDate.java:231)
| at (#2:1)
Base64
從 ea20 起,使用 AVX512 進行編碼會變得更快,但在 Windows 上無法確定。
Boolean
parseBoolean
官方表示,在刪除冗餘的空檢查後,它的速度變得更快。
JDK10
public static boolean parseBoolean(String s) {
return ((s != null) && s.equalsIgnoreCase(“true”));
}
JDK11
public static boolean parseBoolean(String s) {
return “true”.equalsIgnoreCase(s);
}
還未確定是否存在效能差異。
TimSort
TimSort 是用於 Array.sort() 和 Collection.sort() 的主要演演算法。
但它有一個錯誤,主要發生在為某些序列丟擲一個 ArrayIndexOutOfBoundsException 異常,不過似乎已修複,尚未確定。
●編號749,輸入編號直達本文
●輸入m獲取文章目錄
Web開發
更多推薦《18個技術類微信公眾號》
涵蓋:程式人生、演演算法與資料結構、駭客技術與網路安全、大資料技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。