Oracle 已正式發佈 Java 11 LTS(長期支持版), 上一個長期支持版是Java 8 (其支持只到2025年3月)
中間經歷了Java 9, Java 10, 到底改了哪些東西, 有需要升級版本嗎? 一起來看看
局部變量類型推斷:
var hello = "Hello World!";
System.out.println(hello);
可以清楚的看到, 不用指定變數型態, 編譯器會自動推斷, 以上範例就是自動推斷為String
String類別加強
// 判斷是否為空白
" ".isBlank(); // true
// 去除首尾空格
" Javastack ".strip(); // "Javastack"
// 去除尾部空格
" Javastack ".stripTrailing(); // " Javastack"
// 去除首部空格
" Javastack ".stripLeading(); // "Javastack "
// 複製
"Java".repeat(3); // "JavaJavaJava"
// 行數統計
"A\nB\nC".lines().count(); // 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的子類, 所以創建了一個新的物件。
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 不成立則開始
Optional加強
Optional可直接轉換成Stream類別
Optional.of("helloJava").orElseThrow(); //helloJava
Optional.of("helloJava").stream().count(); //1
Optional.ofNullable(null)
.or(() -> Optional.of("helloJava"))
.get(); //helloJava
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);
}
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的朋友, 可撐一陣子再換, 但以長期來看新版本的確是值得投資的。