在本文中,我们介绍了 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
我们下载 OpenJDK 或 Oracle JDK 。
IntelliJ IDEA 2018.2.4 社区版已支持 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 打包规则。
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
程序包中。
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
方法。
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
方法可用于正则表达式。
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
This is the output.
文件readString
和writeString
readString()
方法将文件中的所有内容读取为字符串,writeString()
方法将CharSequence
写入文件。
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
文件。
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
This is the output.
在本教程中,我们研究了 Java 11 的新编程功能。