原文:http://zetcode.com/articles/java11/

在本文中,我们介绍了 Java 11 的一些新功能。Java 11 于 25.9 发布。 2018。在本文中,我们将重点介绍 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 社区版已支持 Java 11。

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

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

Java 11-启动单文件源文件

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

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

SimpleEx.java

  1. package com.zetcode;
  2. public class SimpleEx {
  3. public static void main(String[] args) {
  4. System.out.println("Java 11 example");
  5. }
  6. }

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

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

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

HttpClient标准化

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

HttpClientEx.java

  1. package com.zetcode;
  2. import java.net.http.HttpClient;
  3. import java.net.http.HttpRequest;
  4. import java.net.http.HttpResponse;
  5. import java.net.URI;
  6. public class HttpClientEx {
  7. public static void main(String[] args) {
  8. var client = HttpClient.newHttpClient();
  9. var request = HttpRequest.newBuilder()
  10. .uri(URI.create("http://webcode.me"))
  11. .build();
  12. client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
  13. .thenApply(HttpResponse::body)
  14. .thenAccept(System.out::println)
  15. .join();
  16. }
  17. }

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

  1. $ ~/bin/jdk-11/bin/java HttpClientEx.java
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  8. <title>My html page</title>
  9. </head>
  10. <body>
  11. <p>
  12. Today is a beautiful day. We go swimming and fishing.
  13. </p>
  14. <p>
  15. Hello there. How are you?
  16. </p>
  17. </body>
  18. </html>

服务器以该 HTTP 文件响应。

Java 11 新的字符串方法

Java 11 中有新的String方法。

StringMethodsEx.java

  1. package com.zetcode;
  2. public class StringMethodsEx {
  3. public static void main(String[] args) {
  4. var word = "falcon ";
  5. System.out.println(word.repeat(5));
  6. var word2 = "\tnice blue\t";
  7. System.out.println(word2 + "sky");
  8. System.out.println(word2.stripTrailing() + "sky");
  9. System.out.println(word2.stripLeading() + "sky");
  10. System.out.println(word2.strip() + "sky");
  11. var word3 = " ";
  12. System.out.println(word3.isEmpty());
  13. System.out.println(word3.isBlank());
  14. var words = "falcon\neagle\nsky\nwood\nforest";
  15. words.lines().forEach(System.out::println);
  16. }
  17. }

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

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

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

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

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

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

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

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

lines()方法返回从字符串中提取的行流,以行终止符分隔。

  1. $ ~/bin/jdk-11/bin/java StringMethodsEx.java
  2. falcon falcon falcon falcon falcon
  3. nice blue sky
  4. nice bluesky
  5. nice blue sky
  6. nice bluesky
  7. false
  8. true
  9. falcon
  10. eagle
  11. sky
  12. wood
  13. forest

这是输出。

asMatchPredicate方法

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

AsMatchPredicateEx.java

  1. package com.zetcode;
  2. import java.util.Arrays;
  3. import java.util.regex.Matcher;
  4. import java.util.regex.Pattern;
  5. public class AsMatchPredicateEx {
  6. public static void main(String[] args) {
  7. var words = Arrays.asList("dog", "Dog", "DOG", "Doggy");
  8. var pred = Pattern.compile("dog",
  9. Pattern.CASE_INSENSITIVE).asMatchPredicate();
  10. words.forEach((word) -> {
  11. if (pred.test(word)) {
  12. System.out.printf("%s matches%n", word);
  13. } else {
  14. System.out.printf("%s does not match%n", word);
  15. }
  16. });
  17. }
  18. }

asMatchPredicate()方法从编译的模式创建一个新的谓词。 在谓词上,我们称为test()方法。

  1. $ ~/bin/jdk-11/bin/java AsMatchPredicateEx.java
  2. dog matches
  3. Dog matches
  4. DOG matches
  5. Doggy does not match

这是输出。

文件readStringwriteString

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

WriteStringEx.java

  1. package com.zetcode;
  2. import java.nio.file.Path;
  3. import java.nio.file.Files;
  4. import java.io.IOException;
  5. public class WriteStringEx {
  6. public static void main(String[] args) throws IOException {
  7. var words = "forest\nwood\nsky\nrock";
  8. Files.writeString(Path.of("words.txt"), words);
  9. }
  10. }

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

ReadStringEx.java

  1. package com.zetcode;
  2. import java.nio.file.Path;
  3. import java.nio.file.Files;
  4. import java.io.IOException;
  5. public class ReadStringEx {
  6. public static void main(String[] args) throws IOException {
  7. var fileName = "words.txt";
  8. var data = Files.readString(Path.of("words.txt"));
  9. System.out.println(data);
  10. }
  11. }

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

  1. $ ~/bin/jdk-11/bin/java ReadStringEx.java
  2. forest
  3. wood
  4. sky
  5. rock

这是输出。

在本教程中,我们研究了 Java 11 的新编程功能。

您可能也对以下相关教程感兴趣: Java 教程Java 流过滤器教程