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(); //helloJavaOptional.of("helloJava").stream().count(); //1Optional.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的朋友, 可撑一阵子再换, 但以长期来看新版本的确是值得投资的。