国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java 11 教程

douzifly / 980人閱讀

摘要:原文鏈接已于成功發(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 這個關(guān)鍵字簡單地替換掉,讓你避免了寫一大竄的類型麻煩事。

var myList = new ArrayList>>();

for (var current : myList) {
    // current is infered to type: Map>
    System.out.println(current);
}

從Java 11開始,lambda表達(dá)式的參數(shù)也允許使用var關(guān)鍵字,這樣使得你可以為這些參數(shù)添加注解標(biāo)識:

Predicate predicate = (@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();
HttpResponse response = 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());      // 200
Collections

List, SetMap 這樣的集合,它們的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í)例的副本,因此 listcopy 是相同的實(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

dropWhiletakeWhile 方法可以用來決定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();                           // fallback
Strings

最基本的類之一 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();    // 3
InputStreams

最后但并非最不重要的是,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

相關(guān)文章

  • Spring Cloud Alibaba基礎(chǔ)教程:Nacos的集群部署

    摘要:通過本文,我們將完成生產(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ǔ)教...

    elarity 評論0 收藏0
  • Spring Cloud Alibaba基礎(chǔ)教程:Nacos的集群部署

    摘要:通過本文,我們將完成生產(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ǔ)教...

    godruoyi 評論0 收藏0
  • 11個最值得Java開發(fā)者收藏的網(wǎng)站

    摘要:是領(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都一直是最受歡迎的編程語言之一。如今...

    WrBug 評論0 收藏0
  • W3School 教程整理

    摘要:離線版大部分整理自,少部分整理自,由本人整理。感謝站長的無私奉獻(xiàn)。由于本人精力有限,此處的列表不一定能夠及時更新,最新版本請到本人博客查看。 離線版大部分整理自 w3cschool ,少部分整理自 w3school ,由本人整理。 感謝 w3cschool 站長的無私奉獻(xiàn)。 由于本人精力有限,此處的列表不一定能夠及時更新,最新版本請到本人博客查看。 AngularJS教程 最后更...

    douzifly 評論0 收藏0
  • W3School 教程整理

    摘要:離線版大部分整理自,少部分整理自,由本人整理。感謝站長的無私奉獻(xiàn)。由于本人精力有限,此處的列表不一定能夠及時更新,最新版本請到本人博客查看。 離線版大部分整理自 w3cschool ,少部分整理自 w3school ,由本人整理。 感謝 w3cschool 站長的無私奉獻(xiàn)。 由于本人精力有限,此處的列表不一定能夠及時更新,最新版本請到本人博客查看。 AngularJS教程 最后更...

    CoffeX 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<