摘要:原文鏈接已于成功發(fā)布,不過目前絕大多數(shù)人在生產(chǎn)環(huán)境仍舊使用的是。這篇以案例為主的教程涵蓋了從到的絕大多數(shù)重要的語法與特性。當(dāng)編譯器不能正確識別出變量的數(shù)值類型時,將不被允許使用。同步請求將會阻塞當(dāng)前的線程,直到返回響應(yīng)消息。
原文鏈接:https://wangwei.one/posts/921...
Java11 已于 2018/09/25 成功發(fā)布,不過目前 絕大多數(shù)人 在生產(chǎn)環(huán)境仍舊使用的是Java 8。這篇以案例為主的教程涵蓋了從 Java 9 到 Java 11的絕大多數(shù)重要的語法與API特性。讓我們開始吧!
局部變量類型推斷Java 10引入了一個新的語言關(guān)鍵字var,它可以在聲明局部變量 時替換類型信息( 局部 意味著方法體內(nèi)的變量聲明)。
Java 10之前,變量的聲明形式如下:
String text = "Hello Java 9";
現(xiàn)在,你可以使用 var 替換 String 。編譯器將會從變量的賦值中推斷出它的正確類型。在這個例子里 變量text 即為 String 類型:
var text = "Hello Java 10";
不同于 Javascript 中的 var 關(guān)鍵字,Java中的 var 聲明的變量仍舊是靜態(tài)類型。你不能再次賦予另一個與原類型不符的變量值。
var text = "Hello Java 11"; text = 23; // ERROR: Incompatible types(類型錯誤)
var 關(guān)鍵字還可以與 final 一起使用,意義同之前的版本一樣,表示不可修改。
final var text = "Hello Java 10"; text = "Hello Java 11"; // Cannot assign a value to final variable "text"
當(dāng)編譯器不能正確識別出變量的數(shù)值類型時,var將不被允許使用。下面這些代碼都是沒法編譯的代碼:
// Cannot infer type: var a; var nothing = null; var lambda = () -> System.out.println("Pity!"); var method = this::someMethod;
局部變量類型推斷在與復(fù)雜的泛型類型結(jié)合時,能放大它的價值。在下面這個例子中,current 是有著一個冗長的數(shù)據(jù)類型 Map
var myList = new ArrayList
從Java 11開始,lambda表達(dá)式的參數(shù)也允許使用var關(guān)鍵字,這樣使得你可以為這些參數(shù)添加注解標(biāo)識:
Predicatepredicate = (@Nullable var a) -> true;
Tip:在Intellij IDEA中,你可以在按住CMD / CTRL的同時將鼠標(biāo)懸停在變量上,以顯示變量的推斷類型。HTTP Client
Java 9引入了一個新的孵化HttpClient API來處理HTTP請求。從Java 11開始,這個API已經(jīng)可以在標(biāo)準(zhǔn)庫 java.net 中使用了。讓我們來探索一下通過這個API我們可以做些什么。
這個新的 HttpClient 既可以被同步使用,也可以被異步使用。同步請求將會阻塞當(dāng)前的線程,直到返回響應(yīng)消息。BodyHandlers 定義了響應(yīng)消息體的類型(e.g string,byte-array 或 file):
var request = HttpRequest.newBuilder() .uri(URI.create("https://wangwei.one")) .GET() .build(); var client = HttpClient.newHttpClient(); HttpResponseresponse = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.body());
同樣的請求也可以被異步執(zhí)行。調(diào)用 sendAsync 方法不會阻塞當(dāng)前線程,并且會返回 CompletableFuture 對象,用來構(gòu)建異步執(zhí)行結(jié)果的操作流。
var request = HttpRequest.newBuilder() .uri(URI.create("https://wangwei.one")) .build(); var client = HttpClient.newHttpClient(); client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println);
我們可以省略 .GET() 的調(diào)用,因?yàn)樗J(rèn)的請求方式。
下面這個列子,我們以POST的方法向指定的URL發(fā)送數(shù)據(jù)。類似于 BodyHandlers ,你可以使用 BodyPublishers 去定義請求消息體中你想要發(fā)送的數(shù)據(jù)類型,例如 strings, byte-arrays,files 或 input-streams:
var request = HttpRequest.newBuilder() .uri(URI.create("https://postman-echo.com/post")) .header("Content-Type", "text/plain") .POST(HttpRequest.BodyPublishers.ofString("Hi there!")) .build(); var client = HttpClient.newHttpClient(); var response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.statusCode()); // 200
最后這個列子來演示如何通過 BASIC-AUTH 來執(zhí)行身份認(rèn)證。
var request = HttpRequest.newBuilder() .uri(URI.create("https://postman-echo.com/basic-auth")) .build(); var client = HttpClient.newBuilder() .authenticator(new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("postman", "password".toCharArray()); } }) .build(); var response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.statusCode()); // 200Collections
像List, Set 和 Map 這樣的集合,它們的API也得到了擴(kuò)展。List.of 可以從給定的參數(shù)中創(chuàng)建一個不可變的list。List.copyOf 可以創(chuàng)建一個 list 的不可變副本。
var list = List.of("A", "B", "C"); var copy = List.copyOf(list); System.out.println(list == copy); // true
因?yàn)?list 已經(jīng)是不可變的,所以實(shí)際上不需要實(shí)際地地去創(chuàng)建 list 實(shí)例的副本,因此 list 和 copy 是相同的實(shí)例。 但是,如果你復(fù)制一個可變列表,那么 copy 確定就是一個新實(shí)例,因此在改變原始 list 時,要保證沒有副作用產(chǎn)生:
var list = new ArrayList(); var copy = List.copyOf(list); System.out.println(list == copy); // false
當(dāng)創(chuàng)建不可變的 maps 時,你不需要親自去創(chuàng)建一個完整的 map 集合,你可以直接通過 Map.of 來進(jìn)行創(chuàng)建:
var map = Map.of("A", 1, "B", 2); System.out.println(map); // {B=2, A=1}
Java 11中的不可變集合仍然使用舊Collection API中的相同接口。 但是,如果嘗試通過添加或刪除元素來修改不可變集合,則會拋出java.lang.UnsupportedOperationException。 幸運(yùn)的是,如果你嘗試改變不可變集合,Intellij IDEA會通過檢查發(fā)出警告。Streams
Java8中介紹的Stream也新增了方法。Stream.ofNullable 可以從單個元素中構(gòu)造一個Stream:
Stream.ofNullable(null).count(); // 0
dropWhile 與 takeWhile 方法可以用來決定stream中的哪些元素可以被拋棄:
Stream.of(1, 2, 3, 2, 1) .dropWhile(n -> n < 3) .collect(Collectors.toList()); // [3, 2, 1] Stream.of(1, 2, 3, 2, 1) .takeWhile(n -> n < 3) .collect(Collectors.toList()); // [1, 2]
如果你對Streams不是很熟悉,你可以看看這篇文章 Java 8 Streams Tutorial.Optionals
Optionals 也新增了一些非常好用的方法。例如,現(xiàn)在你可以簡單地將 Optionals 轉(zhuǎn)換為 Streams,或者使用另一個optional作為一個空optional的fallback。
Optional.of("foo").orElseThrow(); // foo Optional.of("foo").stream().count(); // 1 Optional.ofNullable(null) .or(() -> Optional.of("fallback")) .get(); // fallbackStrings
最基本的類之一 String 新增了一些輔助方法,用以修剪或檢查空格以及對字符串進(jìn)行流化處理:
" ".isBlank(); // true " Foo Bar ".strip(); // "Foo Bar" " Foo Bar ".stripTrailing(); // " Foo Bar" " Foo Bar ".stripLeading(); // "Foo Bar " "Java".repeat(3); // "JavaJavaJava" "A B C".lines().count(); // 3InputStreams
最后但并非最不重要的是,InputStream最終獲得了一個非常有用的方法來將數(shù)據(jù)傳輸?shù)絆utputStream,這是一個在處理原始數(shù)據(jù)流時非常常見的用例。
var classLoader = ClassLoader.getSystemClassLoader(); var inputStream = classLoader.getResourceAsStream("myFile.txt"); var tempFile = File.createTempFile("myFileCopy", "txt"); try (var outputStream = new FileOutputStream(tempFile)) { inputStream.transferTo(outputStream); }其他JVM特性
這些是 - 在我看來 - 從Java 8遷移到11時最有趣的語言新API功能。但是功能列表并沒有在這里結(jié)束。 最新的Java版本中包含了更多內(nèi)容:
Flow API for reactive programming
Java Module System
Application Class Data Sharing
Dynamic Class-File Constants
Java REPL (JShell)
Flight Recorder
Unicode 10
G1: Full Parallel Garbage Collector
ZGC: Scalable Low-Latency Garbage Collector
Epsilon: No-Op Garbage Collector
Deprecate the Nashorn JavaScript Engine
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/77361.html
摘要:通過本文,我們將完成生產(chǎn)環(huán)境的搭建。第二步修改文件,增加支持?jǐn)?shù)據(jù)源配置,添加目前只支持?jǐn)?shù)據(jù)源的用戶名和密碼。另外,的集群需要個或個以上的節(jié)點(diǎn),并且確保這三個節(jié)點(diǎn)之間是可以互相訪問的。也可以故意的關(guān)閉某個實(shí)例,來驗(yàn)證集群是否還能正常服務(wù)。 前情回顧: 《Spring Cloud Alibaba基礎(chǔ)教程:使用Nacos實(shí)現(xiàn)服務(wù)注冊與發(fā)現(xiàn)》 《Spring Cloud Alibaba基礎(chǔ)教...
摘要:通過本文,我們將完成生產(chǎn)環(huán)境的搭建。第二步修改文件,增加支持?jǐn)?shù)據(jù)源配置,添加目前只支持?jǐn)?shù)據(jù)源的用戶名和密碼。另外,的集群需要個或個以上的節(jié)點(diǎn),并且確保這三個節(jié)點(diǎn)之間是可以互相訪問的。也可以故意的關(guān)閉某個實(shí)例,來驗(yàn)證集群是否還能正常服務(wù)。 前情回顧: 《Spring Cloud Alibaba基礎(chǔ)教程:使用Nacos實(shí)現(xiàn)服務(wù)注冊與發(fā)現(xiàn)》 《Spring Cloud Alibaba基礎(chǔ)教...
摘要:是領(lǐng)域最具代表性的問答網(wǎng)站之一。在,開發(fā)者能夠?yàn)楦鞣N相關(guān)的開源代碼貢獻(xiàn)自己的力量,也可以發(fā)布軟件開發(fā)項目。該網(wǎng)站發(fā)布各技術(shù)領(lǐng)域的高技術(shù)含量內(nèi)容,例如大數(shù)據(jù),云計算,,物聯(lián)網(wǎng),開發(fā)等。是一個大型的資源類網(wǎng)站,主要涉及源代碼和代碼示例。 Java是一種面向?qū)ο蟮木幊陶Z言,由Sun Microsystems公司在1995年的時候正式發(fā)布。直到今天,Java都一直是最受歡迎的編程語言之一。如今...
摘要:離線版大部分整理自,少部分整理自,由本人整理。感謝站長的無私奉獻(xiàn)。由于本人精力有限,此處的列表不一定能夠及時更新,最新版本請到本人博客查看。 離線版大部分整理自 w3cschool ,少部分整理自 w3school ,由本人整理。 感謝 w3cschool 站長的無私奉獻(xiàn)。 由于本人精力有限,此處的列表不一定能夠及時更新,最新版本請到本人博客查看。 AngularJS教程 最后更...
摘要:離線版大部分整理自,少部分整理自,由本人整理。感謝站長的無私奉獻(xiàn)。由于本人精力有限,此處的列表不一定能夠及時更新,最新版本請到本人博客查看。 離線版大部分整理自 w3cschool ,少部分整理自 w3school ,由本人整理。 感謝 w3cschool 站長的無私奉獻(xiàn)。 由于本人精力有限,此處的列表不一定能夠及時更新,最新版本請到本人博客查看。 AngularJS教程 最后更...
閱讀 1574·2021-09-23 11:21
閱讀 2345·2021-09-07 10:13
閱讀 834·2021-09-02 10:19
閱讀 1125·2019-08-30 15:44
閱讀 1720·2019-08-30 13:18
閱讀 1913·2019-08-30 11:15
閱讀 1105·2019-08-29 17:17
閱讀 2017·2019-08-29 15:31