Reference: 原文地址
目前市場上主流的穩(wěn)定版當(dāng)然還得屬Java 8和Java 11,而目前大部分公司的生產(chǎn)環(huán)境還是Java 8居多。
所以如果從自學(xué)角度出發(fā)平道,我覺得這兩個版本都OK,其他中間的一些比如Java 9株灸、Java 10這些非穩(wěn)定版就不用考慮了。
[Java11]vs Java8
Java 11相對于Java 8確實有一部分進(jìn)化擎值,除了有很多內(nèi)部的升級(比如開銷和時延更低的GC慌烧、TLS1.3加持等等)之外,對于初學(xué)使用者來說也有一些語言使用層面的進(jìn)化鸠儿。
變量類型
新版Java引入了一個全新的動態(tài)類型關(guān)鍵字var屹蚊,用var來定義的局部變量不用寫具體類型,編譯器能根據(jù)=右邊的實際賦值來自動推斷出變量的類型
var name = "lukis-tsai";
var list = List.of("lukis", "tsai", "handsome");
// var 在for循環(huán)更加簡單进每,在處理一些復(fù)雜的結(jié)構(gòu)時也更簡潔汹粤,如: List<List<String>>
for(var item : list) {
System.out.println(item);
}
1 var只能在方法里定義,不允許定義類的成員變量
2 var定義的變量需要初始化田晚,一旦賦值后嘱兼,重新賦不同類型的值是不行的
3 var每次只能定義一個變量,不能復(fù)合聲明變量
官方HTTP Client加持
現(xiàn)在java11自帶HTTP Client了贤徒,位于java.net.http包下芹壕,支持發(fā)送同步胃惜、異步的HTTP請求
同步請求:
var request = HttpRequest.newBuilder()
.uri( URI.create("https://blog.csdn.net") )
.GET()
.build();
// 同步請求方式,拿到結(jié)果前會阻塞當(dāng)前線程
var httpResponse = HttpClient.newHttpClient()
.send( request, HttpResponse.BodyHandlers.ofString());
異步請求
CompletableFuture<String> future = HttpClient.newHttpClient().
sendAsync( request, HttpResponse.BodyHandlers.ofString() )
.thenApply( HttpResponse::body );
System.out.println("摸魚劃水喝茶....");
future.get();
String處理增強
新版字符串String類型增加了諸如:isBlank()哪雕、strip()、repeat()等方便的字符串處理方法
String myName = " lukis-tsai ";
System.out.println( " ".isBlank()); // true
System.out.println( " ".isEmpty()); // false
System.out.println( myName.strip()); // 去除空格
System.out.println( myName.stripLeading()); // 去除左空格
System.out.println( myName.stripTrailing() ); // 去除右空格
System.out.println( myName.repeat(2)); // lukis-tsai lukis-tsai
集合增強
主要是增加了諸如of()和copyOf()等方法用于更加方便的創(chuàng)建和復(fù)制集合類型
var list = List.of( "lukis", "tsai", "handsome" );
var conpyList = List.copyOf(list);
System.out.println(list); // 打印 [lukis, tsai, handsome]
System.out.println(conpyList); // 打印 [lukis, tsai, handsome]
var set = Set.of("lukis","tsai");
var copySet = Set.copyOf(set);
System.out.println(set); // 打印 [lukis, tsai]
System.out.println(conpySet); // 打印 [lukis, tsai]
var map = Map.of("lukis","handsome","huahua","pretty");
var conpyMap = Map.copyOf(map);
System.out.println(map); // 打印 {lukis=handsome, huahua=pretty}
System.out.println(copyMap); // 打印 {lukis=handsome, huahua=pretty}
函數(shù)式編程增強
例如Stream 流增加了諸如takeWhile()和dropWhile()的截止結(jié)算方法
var list = List.of( "lukis", "huahua", "kimi" );
// 從集合中依次刪除滿足條件的元素鲫趁,直到不滿足條件為止
var subList = list.stream()
.dropWhile( item -> item.equals("kimi") )
.collect(Collectors.toList());
System.out.println(subList); // 打印 ["lukis", "kimi"]
// 從集合中依次獲取滿足條件的元素斯嚎,知道不滿足條件為止
var subList1 = list.stream()
.takeWhile( item -> item.equals("huahua") )
.collect(Collectors.toList());
System.out.println( upListSub2 ); // 打印 ["huahua"]
文件讀寫增強
1、Files類增強
心心念的直接能把文件內(nèi)容讀取到String以及String回寫到文件的功能終于支持了,可以通過Files類的靜態(tài)方法writeString()和readString()完成
Path path = Paths.get("/Users/lukis/test.txt");
String content = Files.readString(path, StandardCharsets.UTF_8);
System.out.println(content);
Files.writeString( path, "王老七", StandardCharsets.UTF_8 );
2挨厚、InputStream增強
InputStream則增加了一個transferTo()方法堡僻,直接將數(shù)據(jù)丟到OutputStream去:
InputStream inputStream = new FileInputStream( "/Users/lukis/test.txt" );
OutputStream outputStream = new FileOutputStream( "/Users/lukis/test2.txt" );
inputStream.transferTo( outputStream );
支持源文件直接運行
這時候可以直接用java指令去運行Java源文件,直接省去以前javac編譯源文件的過程
java HelloWorld.java