# Java 11 的新功能

原文：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

我们下载 [OpenJDK](http://jdk.java.net/11) 或 [Oracle JDK](https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html) 。

IntelliJ IDEA 2018.2.4 社区版已支持 Java 11。

```java
$ ~/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`

```java
package com.zetcode;

public class SimpleEx {

    public static void main(String[] args) {

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

```

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

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

```

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

## `HttpClient`标准化

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

`HttpClientEx.java`

```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 请求。

```java
$ ~/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`

```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`方法的用法。

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

```

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

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

```

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

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

```

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

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

```

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

```java
$ ~/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`

```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()`方法。

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

```

这是输出。

## 文件`readString`和`writeString`

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

`WriteStringEx.java`

```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`

```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`文件的内容并将其写入控制台。

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

```

这是输出。

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

您可能也对以下相关教程感兴趣： [Java 教程](/lang/java/)， [Java 流过滤器教程](http://zetcode.com/java/streamfilter/)。