ZetCode

Java 11 新特性

最后修改于 2020 年 7 月 13 日

在本文中,我们将介绍 Java 11 的一些新特性。Java 11 于 2018 年 9 月 25 日发布。在本文中,我们将重点介绍 Java 11 的新编程特性。

Java 11 组织变更

Java 11 进行了大量的整理工作。Java EE、CORBA 和 Java FX 已从 JDK 中移除。 它们将从 Maven 仓库中获取。 JavaScript Nashorn 引擎已被弃用。Java 小程序已被彻底移除。

下载 Java 11

我们可以下载 OpenJDKOracle JDK

IntelliJ IDEA 2018.2.4 Community Edition 已经支持 Java 11。

$ ~/bin/jdk-11/bin/java --version
openjdk 11 2018-09-25
OpenJDK Runtime Environment 18.9 (build 11+28)
OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)

在我们的示例中,我们使用了 OpenJDK。

Java 11 - 启动单文件源代码文件

无需事先使用 javac 编译,即可启动单文件 Java 源代码文件。 这有助于新程序员学习 Java 的基础知识,并促进创建更简单的程序。

我们不会用字节码文件弄乱我们的空间,也不需要担心 Java 打包规则。

com/zetcode/SimpleEx.java
package com.zetcode;

public class SimpleEx {

    public static void main(String[] args) {

        System.out.println("Java 11 example");
    }
}

这是一个简单的 Java 源代码文件。 请注意,该文件不必位于 com/zetcode 子目录中。

$ ~/bin/jdk-11/bin/java SimpleEx.java
Java 11 example

我们使用 java 工具启动程序。

HttpClient 标准化

新的 HttpClient 已经标准化。 它位于 java.net.http 包中。

com/zetcode/HttpClientEx.java
package com.zetcode;

import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;

public class HttpClientEx {

    public static void main(String[] args) {

        var client = HttpClient.newHttpClient();
        var request = HttpRequest.newBuilder()
            .uri(URI.create("http://webcode.me"))
            .build();
            
        client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
            .thenApply(HttpResponse::body)
            .thenAccept(System.out::println)
            .join();
    }
}

在该示例中,我们创建了一个新的 http 客户端。 然后,我们生成一个对 webcode.me 网站的异步 HTTP 请求。

$ ~/bin/jdk-11/bin/java HttpClientEx.java
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>My html page</title>
</head>
<body>

    <p>
        Today is a beautiful day. We go swimming and fishing.
    </p>
    
    <p>
         Hello there. How are you?
    </p>
    
</body>
</html>

服务器使用此 HTTP 文件进行响应。

Java 11 新的字符串方法

Java 11 中有一些新的 String 方法。

com/zetcode/StringMethodsEx.java
package com.zetcode;

public class StringMethodsEx {

    public static void main(String[] args) {

        var word = "falcon ";

        System.out.println(word.repeat(5));

        var word2 = "\tnice blue\t";
        System.out.println(word2 + "sky");
        System.out.println(word2.stripTrailing() + "sky");
        System.out.println(word2.stripLeading() + "sky");
        System.out.println(word2.strip() + "sky");

        var word3 = "  ";
        System.out.println(word3.isEmpty());
        System.out.println(word3.isBlank());

        var words = "falcon\neagle\nsky\nwood\nforest";
        words.lines().forEach(System.out::println);
    }
}

在该示例中,我们演示了新 String 方法的用法。

System.out.println(word.repeat(5));

repeat 方法返回重复 n 次的字符串。

System.out.println(word2.stripTrailing() + "sky");
System.out.println(word2.stripLeading() + "sky");
System.out.println(word2.strip() + "sky");

stringTailing 方法返回删除了所有尾随空格的字符串。 stringTailing 方法返回删除了所有前导空格的字符串。 stringTailing 方法返回删除了所有前导和尾随空格的字符串。

System.out.println(word3.isBlank());

如果字符串为空或仅包含空格,则 isBlank 返回 true。

words.lines().forEach(System.out::println);

lines 方法返回一个流,其中包含从字符串中提取的行,由行终止符分隔。

$ ~/bin/jdk-11/bin/java StringMethodsEx.java
falcon falcon falcon falcon falcon 
    nice blue   sky
    nice bluesky
nice blue   sky
nice bluesky
false
true
falcon
eagle
sky
wood
forest

这是输出。

asMatchPredicate 方法

有一个新的 asMatchPredicate 方法,用于处理正则表达式。

com/zetcode/AsMatchPredicateEx.java
package com.zetcode;

import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class AsMatchPredicateEx {

    public static void main(String[] args) {

        var words = Arrays.asList("dog", "Dog", "DOG", "Doggy");

        var pred = Pattern.compile("dog", 
            Pattern.CASE_INSENSITIVE).asMatchPredicate();

        words.forEach((word) -> {
            
            if (pred.test(word)) {
                System.out.printf("%s matches%n", word);
            } else {
                System.out.printf("%s does not match%n", word);
            }
        });
    }
}

asMatchPredicate 方法从编译后的模式创建一个新的谓词。 在谓词上,我们调用 test 方法。

$ ~/bin/jdk-11/bin/java AsMatchPredicateEx.java
dog matches
Dog matches
DOG matches
Doggy does not match

这是输出。

Files readString 和 writeString

readString 方法将文件的所有内容读取到字符串中,writeString 方法将 CharSequence 写入文件。

com/zetcode/WriteStringEx.java
package com.zetcode;

import java.nio.file.Path;
import java.nio.file.Files;
import java.io.IOException;

public class WriteStringEx {

    public static void main(String[] args) throws IOException {

        var words = "forest\nwood\nsky\nrock";

        Files.writeString(Path.of("words.txt"), words);
    }
}

在此示例中,我们将四个单词写入 words.txt 文件。

com/zetcode/ReadStringEx.java
package com.zetcode;

import java.nio.file.Path;
import java.nio.file.Files;
import java.io.IOException;

public class ReadStringEx {

    public static void main(String[] args) throws IOException {

        var fileName = "words.txt";

        var data = Files.readString(Path.of("words.txt"));

        System.out.println(data);
    }
}

在此示例中,我们读取 words.txt 文件的内容并将其写入控制台。

$ ~/bin/jdk-11/bin/java ReadStringEx.java
forest
wood
sky
rock

在本教程中,我们了解了 Java 11 的新编程特性。