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)中查詢與分析。