Java 9 - 17 特性解讀:Java 9

Java 17 是Java 最重要的一個LTS版本之一,但是直接從Java 8 過渡到Java 17跨度太大了,勢必有些困難。所以胖哥抽時間梳理了一下從Java 9到Java 17的一些常用API的變動。今天先來看看Java 9 都有什么東西。
Java 9
Java 9 最大的變化就是引入了一個JShell和模塊化,日常并沒有用太多,所以今天不花時間在這些功能上面。
新的創(chuàng)建集合的方法
用過谷歌Guava類庫的知道,Guava提供了創(chuàng)建集合的靜態(tài)工廠方法,而且能夠推斷泛型,舉個例子:
List<Person> list = Lists.newArrayList();
Map<KeyType, Person> map = Maps.newLinkedHashMap();
而原生態(tài)需要各種new來定義。Java 9改善了這一現(xiàn)狀,現(xiàn)在你可以:
// [1, 2, 3, 4]
List<Integer> integers = List.of(1, 2, 3, 4);
// {1,2,3}
Set<Integer> integerSet = Set.of(1, 2, 3);
// {"hello":"world","hi":"java"}
Map<String, String> hello = Map.of("hello", "world", "hi", "java");
?但是請注意:這些API創(chuàng)建的集合都是不可變的(Immutable),你不能對這些集合進行增刪改。
Stream擴展
Stream API 是Java 8中引入的最重要的特性之一。在Java 9中Stream進一步得到了加強。
ofNullable
Stream<T> ofNullable(T t) 返回包含單個元素的順序Stream ,如果非空,否則返回空Stream 。這個比較簡單就不舉例了。
iterate
Stream<T> iterate(T seed, Predicate<? super T> hasNext, UnaryOperator<T> next)
這個是用來生成有限流的新迭代實現(xiàn)。
seed初始種子值hasNext用來判斷何時結(jié)束流,這個與seed有關(guān)。如何該函數(shù)不迭代保留seed計算,返回的流可能為空。next函數(shù)用來計算下一個元素值。
舉個例子:
Stream.iterate(0, i -> i < 5, i -> i + 1)
.forEach(System.out::println);
等同于傳統(tǒng)的:
for (int i = 0; i < 5; ++i) {
System.out.println(i);
}
takeWhile
Stream.takeWhile(Predicate) Stream中元素會被斷言Predicate,一旦元素斷言為false就中斷操作,忽略掉沒有斷言的元素(及時未斷言中的元素有滿足條件的),僅僅把之前滿足元素返回。
Stream.of(1, 2, 3, 4, 2, 5)
.takeWhile(x -> x < 4)
.forEach(System.out::println);
上面的例子中只會輸出1、2、3。
dropWhile
這個API和takeWhile機制類似,也用來篩選Stream中的元素。不過符合斷言的元素會被從Stream中移除。一旦元素斷言為false,就會把斷言為false的元素以及后面的元素統(tǒng)統(tǒng)返回。
Stream.of(1, 2, 3, 4, 2, 5)
.dropWhile(x -> x < 4)
.forEach(System.out::println);
上面的例子會輸出4、2、5。
?和
filter操作可不一樣啊,切記!
Optional擴展
Optional增加了三個有用的API。
stream()Optional現(xiàn)在可以轉(zhuǎn)Stream。ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)如果有值了怎么消費,沒有值了怎么消費。or(Supplier<? extends Optional<? extends T>> supplier)如果有值就返回有值的Optional,否則就提供能獲取一個有值的Optional的渠道(Supplier)。
try-with-resources 優(yōu)化
在Java 7 中引入了try-with-resources功能,保證了每個聲明了的資源在語句結(jié)束的時候都會被關(guān)閉。任何實現(xiàn)了java.lang.AutoCloseable接口的對象,和實現(xiàn)了java.io.Closeable接口的對象,都可以當做資源使用。
在Java 7中需要這樣寫:
try (BufferedInputStream bufferedInputStream = new BufferedInputStream(System.in);
BufferedInputStream bufferedInputStream1 = new BufferedInputStream(System.in)) {
// do something
} catch (IOException e) {
e.printStackTrace();
}
而到了Java 9簡化為:
BufferedInputStream bufferedInputStream = new BufferedInputStream(System.in);
BufferedInputStream bufferedInputStream1 = new BufferedInputStream(System.in);
try (bufferedInputStream;
bufferedInputStream1) {
// do something
} catch (IOException e) {
e.printStackTrace();
}
接口私有方法
繼Java 8 引入了接口靜態(tài)方法和接口默認方法后,又引入了接口私有方法:
public interface Catable {
/**
* 接口私有方法
*/
private void doSomething() {
}
}
引入HttpClient
定義一個新的 HTTP 客戶端 API 來實現(xiàn) HTTP/2 和 WebSocket,并且可以替換舊的HttpURLConnectionAPI。Java以前原生的確實難用,所以誕生了Apache HttpClientComponents 、OkHttp等好用的客戶端。新的也不怎么好用,不過也算從零到一了。
HttpRequest httpRequest = HttpRequest.newBuilder(newURI)
.header("Content-Type","*/*")
.GET()
.build();
HttpClient httpClient = HttpClient.newBuilder()
.connectTimeout(Duration.of(10, ChronoUnit.SECONDS))
.version(HttpClient.Version.HTTP_2)
.build();
Flow
Spring WebFlux響應(yīng)式Web框架已經(jīng)4年了,響應(yīng)流規(guī)范(reactive streams)在Java 9 中也初步引入到了JDK中。這個東西目前還有些先進,胖哥還沒找到具體應(yīng)用場景,先挖個坑。
總結(jié)
其實Java 9 還有一些底層的優(yōu)化,不過對于普通開發(fā)者來說了解這些就夠用了。上面幾個特性,比較常用的就是靜態(tài)不變集合、try-with-resources優(yōu)化。其它的特性需要你對Java 8非常熟練的情況下才會錦上添花。
往期推薦
技術(shù)交流群
最近有很多人問,有沒有讀者交流群,想知道怎么加入。加入方式很簡單,有興趣的同學(xué),只需要點擊下方卡片,回復(fù)“加群“,即可免費加入我們的高質(zhì)量技術(shù)交流群!
