Java 11新功能介紹

張益裕 Michael Chang

  • 精誠資訊/恆逸教育訓練中心-資深講師
  • 技術分類:程式設計

 

 

Oracle於2018年9月發布了Java 11,比前一個版本Java 10晚了6個月。Java 11 是繼Java 8之後的第一個長期支援 (LTS) 版本。Oracle也在2019年1月停止支援Java 8。接下來會介紹Java 11加入的新特性。

Java 11為String類別加入一些新方法:isBlank, lines, strip, stripLeading, stripTrailing與repeat:


String s = "Java 11 \n \n new String \n methods.";
List<String> lines = s.lines()
    .filter( line -> !line.isBlank() )
    .map( String::strip )
    .collect( Collectors.toList() );                
                

這些方法可以減少處理字串物件所使用的API數量。上面程式片段中使用的strip方法,它提供與trim方法同樣的功能,但是具有更好的控制和Unicode支援。

java.util.Collection介面包含一個新的default toArray方法,它接收一個IntFunction參數。這使得從集合中建立正確類型的陣列變得更加容易:


List<String> data = Arrays.asList(
        "Java", "11", "Collection", "to", "array");
String[] array = data.toArray(String[]::new);                            
                

Predicate介面加入一個static方法not,我們可以使用它來否定一個現有的條件,就像negate方法:


List<String> data = Arrays.asList(
        "Java", "\n \n", "11", "Collection", "to", "array");
List<String> result = data.stream()
    .filter( lPredicate.not(String::isBlank) )
    .collect( Collectors.toList() );                                                   
                

雖然 not(isBlank) 比 isBlank.negate() 閱讀起來會更自然一些,但最大的優勢是可以將not與method reference一起使用,例如 not(String:isBlank)。

Java 11新增在lambda參數中使用local variable type inference(var)的支援。它可以使用在區域變數,例如定義annotation:


List<String> data = Arrays.asList(
        "Java", "11", "local", "variable", "for", "lambda", null);
String result = data.stream()
    .map( (@NonNull var x) -> x.toUpperCase() )
    .collect(Collectors.joining(", "));                                                    
                

Java 9加入java.net.http套件中新的HTTP用戶端API,它現在已成為Java 11的標準功能。新的HTTP API提高了整體性能,並提供對HTTP/1.1和HTTP/2的支援:


HttpClient httpClient = HttpClient.newBuilder()
        .version(HttpClient.Version.HTTP_2)
        .connectTimeout(Duration.ofSeconds(20))
        .build();
HttpRequest httpRequest = HttpRequest.newBuilder()
        .GET()
        .uri(URI.create("http://localhost:8080"))
        .build();
HttpResponse httpResponse = 
        httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());                                                                   
                

Java 11一個主要變化是不再需要使用javac編譯Java原始程式碼。例如在Java 11之前,您必須先編譯原始程式碼之後再執行程式:


$ javac HelloJava.java
$ java HelloJava
Hello Java! 
                

現在您可以直接使用java命令執行程式:


$ java HelloJava.java
Hello Java!                        
                

Java Flight Recorder (JFR) 現在於Open JDK中是開放原始碼,它曾經是Oracle JDK中的商業產品。JFR 是一個Java應用程式效能分析工具,您可以使用它從正在運行的Java應用程式收集診斷和分析數據。

如果希望在應用程式開始運作後執行120秒的JFR錄製,可以使用以下參數:

-XX:StartFlightRecording=duration=120s,settings=profile,filename=myapp.jfr                        
            

JFR在記錄中產生的資源耗用通常低於1%。記錄的所有資訊都可以在圖形化工具JDK Mission Control (JMC)中查詢與分析。


您可在下列課程中了解更多技巧喔!