iT邦幫忙

5

Java 11 正式發佈, 一起來看有哪些新功能與改變

Oracle 已正式發佈 Java 11 LTS(長期支持版), 上一個長期支持版是Java 8 (其支持只到2025年3月)

中間經歷了Java 9, Java 10, 到底改了哪些東西, 有需要升級版本嗎? 一起來看看

  1. 局部變量類型推斷:

    var hello = "Hello World!";
    System.out.println(hello);
    

    可以清楚的看到, 不用指定變數型態, 編譯器會自動推斷, 以上範例就是自動推斷為String

  2. String類別加強

    // 判斷是否為空白  
    " ".isBlank();                // true  
    
    // 去除首尾空格  
    " Javastack ".strip();          // "Javastack"  
    
    // 去除尾部空格   
    " Javastack ".stripTrailing();  // " Javastack"  
    
    // 去除首部空格   
    " Javastack ".stripLeading();   // "Javastack "  
    
    // 複製  
    "Java".repeat(3);             // "JavaJavaJava"  
    
    // 行數統計  
    "A\nB\nC".lines().count();    // 3
    
  3. 集合加強

    List/Set/Map 都加入了 of 和 copyOf 方法, 適用於創建不可變的集合(Immutable Collection)

    var list = List.of("Hello", "World", "Java");
    var copy = List.copyOf(list);
    System.out.println(list == copy); //true
    
    var list = new ArrayList<String>();
    var copy = List.copyOf(list);
    System.out.println(list == copy); //false
    

    為何一個為true, 一個為false呢?

    是因為copyOf方法會先判斷來源是否為AbstractImmutableList類型, 如果是就返回, 不是則新建一個

    而範例2 new ArrayList不屬於AbstractImmutableList的子類, 所以創建了一個新的物件。

  4. Stream加強

    增加ofNullable方法, 可為null

    Stream.ofNullable(null).count();  //0
    

    增加takeWhile和dropWhile

    Stream.of(1,2,3,4,5)
    .takeWhile(i -> i < 3)
    .Collect(Collectors.toList());  //[1,2]
    

    從0開始算, 若i < 3則停止

    Stream.of(1,2,3,4,5)
    .dropWhile(i -> i < 3)
    .Collect(Collectors.toList()); //[3,4,5]
    

    跟上面相反, 若i < 3 不成立則開始

  5. Optional加強
    Optional可直接轉換成Stream類別

    Optional.of("helloJava").orElseThrow();   //helloJava
    Optional.of("helloJava").stream().count();   //1
    Optional.ofNullable(null)
    .or(() -> Optional.of("helloJava"))
    .get();   //helloJava
    
  6. InputStream加強
    超實用的transferTo, 直接將InputStream轉成OutputStream

    var loader = ClassLoader.getSystemClassLoader();
    var inputStream = loader.getResourceAsStream("helloJava.txt");
    var file = File.createTempFile("helloJava2", "txt");
    try(var outputStream = new FileOutputStream(file)){
        inputStream.transferTo(outputStream);
    }
    
  7. HTTP Client API
    Java的HTTP早該更新了, 此次更新支持了同步與非同步, 有了新的HTTP Client, 誰還需要導入apache包呢

    var request = HttpRequest.newBuilder(URI.create("https://www.google.com"))
    .GET()
    .build();
    var client = HttpClient.newHttpClient();
    //同步
    HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
    System.out.println(response.body());
    //非同步
    client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
    .thenApply(HttpResponse::body)
    .thenAccept(System.out::println);
    

此外還有對GC(垃圾回收器)做了加強, 支持TLS 1.3協定...等等

如果目前專案使用Java 6的朋友, 推薦可以換新版本

若是用Java 8的朋友, 可撐一陣子再換, 但以長期來看新版本的確是值得投資的。


尚未有邦友留言

立即登入留言