上了一天的班了。想必大家都有强烈的周一综合症吧。反正我是很强烈的。拖拖拉拉拖了一天,想想欠的债还是要还的。今天就把Java 9新特性示例的下半部分Done了。老惯例,还是会带上示例代码的。希望大家能喜欢。
程序员必读Java9新特性示例(下)不可变集合类的工厂方法
Java 9 引入一些方便使用的工厂方法,用于创建不可变集合 List,Set,Map 和 Map.Entry 对象。这些高效实用的方法可用来创建空或者非空集合对象。
在 Java SE 8 和更早版本中,我们常用类似 unmodifiableXXX 的集合类方法创建不可变集合对象。举个例子,比如我们想创建一个不可变的 List 对象,可能使用到****Collections.unmodifiableList****方法。
但是大家也能感受得到,这些 c
ollections.unmodifiableXXX
方法显得非常冗长乏味。为了克服这些缺陷,Java 9给 List、Set 和 Map 接口分别添加了两个更加实用的方法。List 和 Set 接口使用
of()
方法创建一个空或者非空的不可变 List 或 Set 对象。
-
空的List的可以写成:List nullableList = List.of();
-
非空的List可以写成:List normalList = List.of("cat","dog","human");
-
空的Map可以写成:Map emptyMap = Map.of();
-
非空的Map的写法很Cool,是这样的:Map normalMap = Map.of(1, "one", 2, "two", 3, "three")
Reactive Streams风格的引进
在满世界都在说Reactive Programming超级厉害的时候,Java 9也算是与时俱进。跟上了大部队。Java 9 Reactive Streams API 跟大家一样也是一个发布订阅型框架,使我们能够非常简单地使用 Java 语言就能实现异步的、可拓展的和并行的应用。
Java SE 9 引进下面这些 API 来在基于 Java 语言的应用中开发 Reactive Streams:
-
java.util.concurrent.Flow
-
java.util.concurrent.Flow.Publisher
-
java.util.concurrent.Flow.Subscriber
-
java.util.concurrent.Flow.Processor
当然,更多Reactive有关的说明我们会单独开一个文章来讲,毕竟还是很有内容的一个模型。
匿名类中使用Diamond Operator
Java 7中引进了Diamond Operator之后的提高了很多的可读性和简化了一些些代码。然而在 Java 8 中,Diamond 操作器和匿名内部类的使用中存在一些局限性,后来修复了这些问题并准备将其作为 Java 9 的一部分发布出去。这次的Java 9中就包含这个。
Optional类中添加了新的方法
在Java SE 9 添加了一些新的实用方法到
java.util.Optional
类里面。
这里我们用一些简单的示例来描述其中的一个看起来比较好玩的方法:stream
如果一个值出现在给定 Optional 对象中,stream() 方法可以返回包含该值的一个顺序 Stream 对象。否则,将返回一个空 Stream。
stream()
方法已经被添加,并用来在 Optional 对象中使用,如:Stream<Optional> emp = getEmployee(id)
Stream API中添加了dropWhile 和 takeWhile
Java SE 9 中添加了四个非常有用的新方法到
java.util.Stream
接口里面。正如 Stream 作为一个接口类,所有这些新的实现方法都是默认方法。
其中有两个方法非常重要:dropWhile 和 takeWhile。如果你熟悉 Scala 语言或者其它函数编程语言的话,你一定知道这些方法。他们在写一些功能样式代码时非常有用。例如:
<pre style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; white-space: normal; color: rgb(34, 34, 34); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;">Stream.of(1,2,3,4,5,6,7,8,9,10).takeWhile(i -> i < 5 ).forEach(System.out::println);</pre>
这个
takeWhile()
方法使用一个断言作为参数,返回给定 Stream 的子集直到断言语句第一次返回 false。如果第一个值不满足断言条件,将返回一个空的 Stream。
强化了 @Deprecated 注释
在 Java SE 8 和更早版本上,@Deprecated 注解只是一个没有任何方法的标记类接口。它的作用是标记一个 Java API,可以是 calss,field,method,interface,constructor 等。
在 Java SE 9 中强化了 @Deprecated 注解,来提供更多有关废弃 API 的介绍信息,同时也提供一个工具来分析项目中的废弃 API 的静态使用情况。Java 9 在Deprecated中添加了两个方法到 Deprecated 接口中来提供服务:forRemoval 和 since。
当然,我们仅仅列出了我们觉得有意思的,其实还有很多很好玩的方法,也希望各位同学能够跟我们互动,共同进步。这个坑我也算是填上了。
网友评论