Java Language Changes for Java SE 11
1. Java 11 String API
1.1 repeat()
将字符串内容重复n次。
  @Test
  public void whenRepeatStringTwice_thenGetStringTwice() {
    String output = "Ha ".repeat(2) + "Land";
    assertEquals(output, "Ha Ha Land");
  }1.2 strip()
删除字符串前后的空白字符。strip()能识别Unicode,trim()不能识别Unicode。
  @Test
  public void whenStripString_thenReturnStringWithoutWhitespaces() {
    assertEquals("\n\t  hello   \u2005".strip(), "hello");
  }  @Test
  public void whenTrimAdvanceString_thenReturnStringWithWhitespaces() {
    assertEquals("\n\t  hello   \u2005".trim(), "hello   \u2005");
  }1.3 isBlank()
判断字符串是否只包含空白字符。
  @Test
  public void whenBlankString_thenReturnTrue() {
    assertTrue("\n\t\u2005  ".isBlank());
  }1.4 lines()
将字符串分割成多行字符串。返回Stream。
  @Test
  public void whenMultilineString_thenReturnNonEmptyLineCount() {
    String multilineStr = "This is\n \n a multiline\n string.";
    List<String> lines = multilineStr.lines()
        .filter(Predicate.not(String::isBlank))
        .collect(Collectors.toList());
    assertThat(lines).containsExactly("This is", " a multiline", " string.");
  }2. File
读取文件内容为字符串。写入字符串内容到文件。
  @Test
  public void testReadStringFromFIleAndWriteStringToFile() throws IOException {
    Path tempDir = Path.of("/tmp");
    Path filePath = Files.writeString(Files.createTempFile(tempDir, "demo", ".txt"), "Sample text");
    String fileContent = Files.readString(filePath);
    assertEquals(fileContent, "Sample text");
  }3. Collection to an Array
接收一个IntFunction将集合转换为数组。
  @Test
  public void testCollectionToArray() {
    List<String> sampleList = Arrays.asList("Java", "Kotlin");
    String[] sampleArray = sampleList.toArray(String[]::new);
    assertThat(sampleArray).containsExactly("Java", "Kotlin");
  }4. Predicate.not()
类似于.negate(),但是可以使用方法引用。
  @Test
  public void testNotPredicate() {
    List<String> sampleList = Arrays.asList("Java", "\n \n", "Kotlin", " ");
    List<String> withoutBlanks = sampleList.stream()
        .filter(Predicate.not(String::isBlank))
        .collect(Collectors.toList());
    assertThat(withoutBlanks).containsExactly("Java", "Kotlin");
  }5. Lambad本地变量
用于添加注解。
  @Test
  public void testLocalVariableInLambda() {
    List<String> sampleList = Arrays.asList("Java", "Kotlin");
    String resultString = sampleList.stream()
        .map((@NotNull var x) -> x.toUpperCase())
        .collect(Collectors.joining(", "));
    assertThat(resultString).isEqualTo("JAVA, KOTLIN");
  }6. HTTP Client
支持HTTP/1.1 和 HTTP/2。
  @Test
  public void testHttpClient() throws IOException, InterruptedException {
    HttpClient httpClient = HttpClient.newBuilder()
        .version(HttpClient.Version.HTTP_2)
        .connectTimeout(Duration.ofSeconds(20))
        .build();
    HttpRequest httpRequest = HttpRequest.newBuilder()
        .GET()
        .uri(URI.create("http://httpbin.org/get"))
        .build();
    HttpResponse<String> httpResponse = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());
    assertThat(httpResponse.body()).contains("http://httpbin.org/get");
  }7. Nest Based Access Control
public class MainClass {
  public class NestedClass {
  }
}  @Test
  public void testNestBasedAccessControl() {
    assertThat(MainClass.class.isNestmateOf(MainClass.NestedClass.class)).isTrue();
    assertThat(MainClass.NestedClass.class.getNestHost()).isEqualTo(MainClass.class);
    Set<String> nestedMembers = Arrays.stream(MainClass.NestedClass.class.getNestMembers())
        .map(Class::getName)
        .collect(Collectors.toSet());
    assertThat(nestedMembers).contains(MainClass.class.getName(), MainClass.NestedClass.class.getName());
  }8. Running Java Files
不需要使用javac编译,直接运行.java文件。
$ java HelloWorld.java
Hello Java 11!
 
          