JDK 11 已处于特性冻结状态,看看 Java 11 API 变更提案 – 开源中国社区

问答

[
登录 |
注册 ]

JDK 11 已处于特性冻结状态,看看 Java 11 API 变更提案

局长
2018年07月25日

JDK 11 已处于特性冻结状态,看看 Java 11 API 变更提案

局长
局长
发布于2018年07月25日
收藏 19

自从上个月进入“减速(ramp-down)”阶段以来,JDK 11 的特性已经处于冻结状态。这些重大的变化已被列为 JEP(JDK Enhancement Proposal 特性增强提议)。此外,JDK 11 中也有很多除 JEP 之外的变化,但官方尚未总结。因此,本文将列出我所知道的 JDK 11 中的 API 变更。

String

lines()

字符串实例方法,使用专门的 Spliterator 来懒惰地提供源字符串中的行

jshell> "test\nhoge\n".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 = "\u0020"
halfSpace ==> " "

jshell> halfSpace.isBlank()
$11 ==> true

jshell> var fullSpace = "\u3000"
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[list.size())]) 这样的无风格标记(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 异常,不过似乎已修复,尚未确定。

来源:https://dzone.com/ 编译:开源中国


本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 开源中国社区
[http://www.oschina.net]
本文标题:JDK 11 已处于特性冻结状态,看看 Java 11 API 变更提案

评论
(37)

精彩评论





6

JAVA6飘过,他们不让升级,所以一直用6,switch连字符串都不可以,蛋疼:flushed::flushed::flushed:




4

Predicate.not(String::isEmpty) 还是太丑,我宁可写 str -> !String.isEmpty(str)




2

先 java8顶着. 等11出来了, 可以先在不重要的项目上试验试验




2

引用来自“养码场码农”的评论

JAVA6飘过,他们不让升级,所以一直用6,switch连字符串都不可以,蛋疼:flushed::flushed::flushed:

一直用6,所以你们公司才能666啊




1

引用来自“MyOldTime”的评论

说出来你们可能不行,我们特么的还在使用jdk1.5,连特么的
@Override 注解都不支持

引用来自“MoreBugs”的评论

你才不行 哈哈 活捉错别字

手抖打错了,:grin:

最新评论





0

感觉越来越像某些脚本语言,java有点走偏了。




0

不知不觉就有11了,最近几年更新好快,我现在还沉浸在java8中无法自拔




0

引用来自“MyOldTime”的评论

说出来你们可能不行,我们特么的还在使用jdk1.5,连特么的
@Override 注解都不支持

引用来自“MoreBugs”的评论

你才不行 哈哈 活捉错别字

引用来自“MyOldTime”的评论

手抖打错了,:grin:

1.4也没什么




0

公司让用Go了,唉Java变好了反而要撤了




0

我能说我不爱用switch,一直ifelse




0

美死一个天皇就得打一个补丁?




0

真香




0

引用来自“MyOldTime”的评论

说出来你们可能不行,我们特么的还在使用jdk1.5,连特么的
@Override 注解都不支持

引用来自“MoreBugs”的评论

你才不行 哈哈 活捉错别字

引用来自“MyOldTime”的评论

手抖打错了,:grin:

引用来自“xueyinglei”的评论

jdk1.5不支持@Override?

确实不资瓷:stuck_out_tongue_closed_eyes:




0

引用来自“old_big”的评论

api 变得越来月人性化,现代化了,java版本变更终于快了点,以前好多年升一个版本,其他现代化语言有的精彩特性java要十年才能引入,这让吃老本的废材程序猿有些安慰,他们可以自豪的说“还在使用java6的漂过”,对于有追求的程序猿来说太折磨了,java11引入了多行字符串,这个简直是哭着喊着要了很多年,终于有了。

引用来自“dwingo”的评论

实际上多行字符串仍然没被JDK11支持…继续哭着喊着吧 :smirk:

引用来自“old_big”的评论

是啊,还得继续哭着喊着,就看JDK12的了。groovy,scala,kotlin都支持了,但是引入一门语言到项目里还是比较困难的,程序猿不喜欢引入新语言。

这个提案才出了半年. 元老,社区和oracle都要商议很久才能敲定. 慢慢等吧…

不过有些特性确实需要谨慎考虑, 一旦加进来就不好再改了, 拖了很久的特性都是反对比较多的.

Java坚决不能挖Python2/3那样兼容性差异大的坑.




0

引用来自“old_big”的评论

api 变得越来月人性化,现代化了,java版本变更终于快了点,以前好多年升一个版本,其他现代化语言有的精彩特性java要十年才能引入,这让吃老本的废材程序猿有些安慰,他们可以自豪的说“还在使用java6的漂过”,对于有追求的程序猿来说太折磨了,java11引入了多行字符串,这个简直是哭着喊着要了很多年,终于有了。

引用来自“dwingo”的评论

实际上多行字符串仍然没被JDK11支持…继续哭着喊着吧 :smirk:

是啊,还得继续哭着喊着,就看JDK12的了。groovy,scala,kotlin都支持了,但是引入一门语言到项目里还是比较困难的,程序猿不喜欢引入新语言。




0

引用来自“抢小孩糖吃”的评论

新GC算法的出现,不用就没有天理了2ms的GC。菜鸟的福音啊,写多烂GC都很快

引用来自“dwingo”的评论

GC停顿短 != GC快

是对比楼主说的1.6,从单线程GC,到ZGC。真心是速度差好多。




0

引用来自“抢小孩糖吃”的评论

新GC算法的出现,不用就没有天理了2ms的GC。菜鸟的福音啊,写多烂GC都很快

引用来自“jungggle”的评论

哪个新算法??

ZGC




4

Predicate.not(String::isEmpty) 还是太丑,我宁可写 str -> !String.isEmpty(str)




0

有多行字符串没




0

引用来自“old_big”的评论

api 变得越来月人性化,现代化了,java版本变更终于快了点,以前好多年升一个版本,其他现代化语言有的精彩特性java要十年才能引入,这让吃老本的废材程序猿有些安慰,他们可以自豪的说“还在使用java6的漂过”,对于有追求的程序猿来说太折磨了,java11引入了多行字符串,这个简直是哭着喊着要了很多年,终于有了。

引用来自“ideal-ye”的评论

没看到多行字符串的介绍纳

这里有介绍,https://yanbin.blog/from-java-10-var-to-11-candicate-multiple-line-string/#more-8865

我感觉这个特性相当容易实现,却能给程序猿减少拼接字符串的巨大痛苦,希望这次能包含到里边。




0

引用来自“old_big”的评论

api 变得越来月人性化,现代化了,java版本变更终于快了点,以前好多年升一个版本,其他现代化语言有的精彩特性java要十年才能引入,这让吃老本的废材程序猿有些安慰,他们可以自豪的说“还在使用java6的漂过”,对于有追求的程序猿来说太折磨了,java11引入了多行字符串,这个简直是哭着喊着要了很多年,终于有了。

实际上多行字符串仍然没被JDK11支持…继续哭着喊着吧 :smirk:




0

引用来自“抢小孩糖吃”的评论

新GC算法的出现,不用就没有天理了2ms的GC。菜鸟的福音啊,写多烂GC都很快

GC停顿短 != GC快




0

引用来自“养码场码农”的评论

JAVA6飘过,他们不让升级,所以一直用6,switch连字符串都不可以,蛋疼:flushed::flushed::flushed:

JAVA5飘过,他们不让升级,所以一直用6,switch连字符串都不可以,蛋疼:flushed::flushed::flushed:




0

引用来自“MyOldTime”的评论

说出来你们可能不行,我们特么的还在使用jdk1.5,连特么的
@Override 注解都不支持

引用来自“MoreBugs”的评论

你才不行 哈哈 活捉错别字

引用来自“MyOldTime”的评论

手抖打错了,:grin:

jdk1.5不支持@Override?




0

看这种更新速度, java8要千秋万代一统江湖了.



插入:



  • People
  • Nature
  • Objects
  • Places
  • Symbols







精彩评论





6

JAVA6飘过,他们不让升级,所以一直用6,switch连字符串都不可以,蛋疼:flushed::flushed::flushed:



6




6




4

Predicate.not(String::isEmpty) 还是太丑,我宁可写 str -> !String.isEmpty(str)



4




4




2

先 java8顶着. 等11出来了, 可以先在不重要的项目上试验试验



2




2




2

引用来自“养码场码农”的评论

JAVA6飘过,他们不让升级,所以一直用6,switch连字符串都不可以,蛋疼:flushed::flushed::flushed:

一直用6,所以你们公司才能666啊




2




2




1

引用来自“MyOldTime”的评论

说出来你们可能不行,我们特么的还在使用jdk1.5,连特么的
@Override 注解都不支持

引用来自“MoreBugs”的评论

你才不行 哈哈 活捉错别字

手抖打错了,:grin:




1




1

最新评论





0

感觉越来越像某些脚本语言,java有点走偏了。



0




0




0

不知不觉就有11了,最近几年更新好快,我现在还沉浸在java8中无法自拔



0




0




0

引用来自“MyOldTime”的评论

说出来你们可能不行,我们特么的还在使用jdk1.5,连特么的
@Override 注解都不支持

引用来自“MoreBugs”的评论

你才不行 哈哈 活捉错别字

引用来自“MyOldTime”的评论

手抖打错了,:grin:

1.4也没什么




0




0




0

公司让用Go了,唉Java变好了反而要撤了



0




0




0

我能说我不爱用switch,一直ifelse



0




0




0

美死一个天皇就得打一个补丁?



0




0




0

真香



0




0




0

引用来自“MyOldTime”的评论

说出来你们可能不行,我们特么的还在使用jdk1.5,连特么的
@Override 注解都不支持

引用来自“MoreBugs”的评论

你才不行 哈哈 活捉错别字

引用来自“MyOldTime”的评论

手抖打错了,:grin:

引用来自“xueyinglei”的评论

jdk1.5不支持@Override?

确实不资瓷:stuck_out_tongue_closed_eyes:




0




0




0

引用来自“old_big”的评论

api 变得越来月人性化,现代化了,java版本变更终于快了点,以前好多年升一个版本,其他现代化语言有的精彩特性java要十年才能引入,这让吃老本的废材程序猿有些安慰,他们可以自豪的说“还在使用java6的漂过”,对于有追求的程序猿来说太折磨了,java11引入了多行字符串,这个简直是哭着喊着要了很多年,终于有了。

引用来自“dwingo”的评论

实际上多行字符串仍然没被JDK11支持…继续哭着喊着吧 :smirk:

引用来自“old_big”的评论

是啊,还得继续哭着喊着,就看JDK12的了。groovy,scala,kotlin都支持了,但是引入一门语言到项目里还是比较困难的,程序猿不喜欢引入新语言。

这个提案才出了半年. 元老,社区和oracle都要商议很久才能敲定. 慢慢等吧…

不过有些特性确实需要谨慎考虑, 一旦加进来就不好再改了, 拖了很久的特性都是反对比较多的.

Java坚决不能挖Python2/3那样兼容性差异大的坑.




0




0




0

引用来自“old_big”的评论

api 变得越来月人性化,现代化了,java版本变更终于快了点,以前好多年升一个版本,其他现代化语言有的精彩特性java要十年才能引入,这让吃老本的废材程序猿有些安慰,他们可以自豪的说“还在使用java6的漂过”,对于有追求的程序猿来说太折磨了,java11引入了多行字符串,这个简直是哭着喊着要了很多年,终于有了。

引用来自“dwingo”的评论

实际上多行字符串仍然没被JDK11支持…继续哭着喊着吧 :smirk:

是啊,还得继续哭着喊着,就看JDK12的了。groovy,scala,kotlin都支持了,但是引入一门语言到项目里还是比较困难的,程序猿不喜欢引入新语言。




0




0




0

引用来自“抢小孩糖吃”的评论

新GC算法的出现,不用就没有天理了2ms的GC。菜鸟的福音啊,写多烂GC都很快

引用来自“dwingo”的评论

GC停顿短 != GC快

是对比楼主说的1.6,从单线程GC,到ZGC。真心是速度差好多。




0




0




0

引用来自“抢小孩糖吃”的评论

新GC算法的出现,不用就没有天理了2ms的GC。菜鸟的福音啊,写多烂GC都很快

引用来自“jungggle”的评论

哪个新算法??

ZGC




0




0




4

Predicate.not(String::isEmpty) 还是太丑,我宁可写 str -> !String.isEmpty(str)



4




4




0

有多行字符串没



0




0




0

引用来自“old_big”的评论

api 变得越来月人性化,现代化了,java版本变更终于快了点,以前好多年升一个版本,其他现代化语言有的精彩特性java要十年才能引入,这让吃老本的废材程序猿有些安慰,他们可以自豪的说“还在使用java6的漂过”,对于有追求的程序猿来说太折磨了,java11引入了多行字符串,这个简直是哭着喊着要了很多年,终于有了。

引用来自“ideal-ye”的评论

没看到多行字符串的介绍纳

这里有介绍,https://yanbin.blog/from-java-10-var-to-11-candicate-multiple-line-string/#more-8865

我感觉这个特性相当容易实现,却能给程序猿减少拼接字符串的巨大痛苦,希望这次能包含到里边。




0




0




0

引用来自“old_big”的评论

api 变得越来月人性化,现代化了,java版本变更终于快了点,以前好多年升一个版本,其他现代化语言有的精彩特性java要十年才能引入,这让吃老本的废材程序猿有些安慰,他们可以自豪的说“还在使用java6的漂过”,对于有追求的程序猿来说太折磨了,java11引入了多行字符串,这个简直是哭着喊着要了很多年,终于有了。

实际上多行字符串仍然没被JDK11支持…继续哭着喊着吧 :smirk:




0




0




0

引用来自“抢小孩糖吃”的评论

新GC算法的出现,不用就没有天理了2ms的GC。菜鸟的福音啊,写多烂GC都很快

GC停顿短 != GC快




0




0




0

引用来自“养码场码农”的评论

JAVA6飘过,他们不让升级,所以一直用6,switch连字符串都不可以,蛋疼:flushed::flushed::flushed:

JAVA5飘过,他们不让升级,所以一直用6,switch连字符串都不可以,蛋疼:flushed::flushed::flushed:




0




0




0

引用来自“MyOldTime”的评论

说出来你们可能不行,我们特么的还在使用jdk1.5,连特么的
@Override 注解都不支持

引用来自“MoreBugs”的评论

你才不行 哈哈 活捉错别字

引用来自“MyOldTime”的评论

手抖打错了,:grin:

jdk1.5不支持@Override?




0




0




0

看这种更新速度, java8要千秋万代一统江湖了.



0




0

关注微信公众号


下载手机客户端


开源中国社区是工信部开源软件推进联盟指定的官方社区
粤ICP备12009483号-3 深圳市奥思网络科技有限公司版权所有