现在,Reactive Programming 由于其便利性在应用程序开发中变得非常流行。Scala、Play、Akka 等框架已经集成 Reactive Streams 并且受益良多。Oracle 公司也在 Java SE 9 中引入了一个新的 Reactive Streams API。
Java SE 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
如果你想了解这个新 API 的更多信息,可以参考我的初体验之:Introduction to Reactive Programming and Java SE 9: Reactive Streams。
9. Diamond Operator for Anonymous Inner Class我们知道,Java SE 7 引入了一个新的特性:Diamond Operator,来避免冗长代码和提升可读性。然而在 Java SE 8 中,Oracle 公司发现在 Diamond 操作器和匿名内部类的使用中存在一些局限性,后来修复了这些问题并准备将其作为 Java 9 的一部分发布出去。
public List getEmployee(String empid){ // Code to get Employee details from Data Store return new List(emp){ }; }
10. Optional Class Improvements在 Java SE 9 中,Oracle 公司添加了一些新的实用方法到 java.util.Optional 类里面。这里我将使用一些简单的示例来描述其中的一个:stream 方法。
如果一个值出现在给定 Optional 对象中,stream() 方法可以返回包含该值的一个顺序 Stream 对象。否则,将返回一个空 Stream。
stream() 方法已经被添加,并用来在 Optional 对象中使用,如:
Stream<Optional> emp = getEmployee(id) Stream empStream = emp.flatMap(Optional::stream)
这里的 Optional.stream() 方法被用来转化 Employee 可选流对象 到 Employee 流中,如此我们便可以在后续代码中使用这个结果。
理解这个特性的更多信息,可参考我的初体验过程: Java SE 9: Optional Class Improvements 。
11. Stream API Improvements在 Java SE 9 中,Oracle 公司添加了四个非常有用的新方法到 java.util.Stream 接口里面。正如 Stream 作为一个接口类,所有这些新的实现方法都是默认方法。其中有两个方法非常重要:dropWhile 和 takeWhile。
如果你熟悉 Scala 语言或者其它函数编程语言的话,你一定知道这些方法。他们在写一些功能样式代码时非常有用。这里我们一起讨论一下 takeWhile 实用方法。
这个 takeWhile() 方法使用一个断言作为参数,返回给定 Stream 的子集直到断言语句第一次返回 false。如果第一个值不满足断言条件,将返回一个空的 Stream。
jshell> Stream.of(1,2,3,4,5,6,7,8,9,10).takeWhile(i -> i < 5 ) .forEach(System.out::println); 1 2 3 4
更多有关 takeWhile、dropWhile 和其它新方法的信息,可以参考我的初体验过程之: Java SE 9: Stream API Improvements 。
12. Enhanced @Deprecated annotation在 Java SE 8 和更早版本上,@Deprecated 注解只是一个没有任何方法的标记类接口。它的作用是标记一个 Java API,可以是 calss,field,method,interface,constructor 等。
在 Java SE 9 中,Oracle 公司强化了 @Deprecated 注解,来提供更多有关废弃 API 的介绍信息,同时也提供一个工具来分析项目中的废弃 API 的静态使用情况。Oracle 公司添加了两个方法到 Deprecated 接口中来提供服务: forRemoval 和 since 。
13. HTTP 2 Client在 Java SE 9 中,Oracle 公司将发布新的 HTTP 2 Client API 来支持 HTTP/2 协议和 WebSocket 特性。现有的 HTTP Client API 存在很多问题(如支持 HTTP/1.1 协议但是不支持 HTTP/2 协议和 WebSocket,仅仅作用在 Blocking 模式中,并存在大量性能问题),他们正在被使用新的 HTTP 客户端的 HttpURLConnection API 所替代。