一、概述
Java語言發展至今,也在不斷跟隨時代的進步,增加了很多新特性。不過java中的語法糖只存在於編譯期, 在編譯器將 .java 源文件編譯成 .class 字節碼時, 會進行解語法糖操作, 還原最原始的基礎語法結構。這些語法糖包含條件編譯、斷言、Switch語句與枚舉及字符串結合、可變參數、自動裝箱/拆箱、枚舉、泛型擦除、增強for循環、lambda表達式、try-with-resources語句、JDK10的局部變量類型推斷等等。
二、簡述
2.1 條件編譯
在if判斷中,明顯可推斷出不成立的代碼,在字節碼編譯的時候,編譯器會將不成立的代碼刪除不進行字節碼編譯,如:
public void ifCompilerTest() {
if(false) {
System.out.println("false if");
}else {
System.out.println("true else");
}
}
2.2 斷言
java斷言有如下所示的兩種形式:
assert condition;這裏condition是一個必須爲真(true)的表達式。如果表達式的結果爲true,那麼斷言爲真,並且無任何行動。如果表達式爲false,則斷言失敗,則會拋出一個AssertionError對象。這個AssertionError繼承於Error對象,而Error繼承於Throwable,Error是和Exception並列的一個錯誤對象,通常用於表達系統級運行錯誤。
asser condition:expr;這裏condition是和上面一樣的,這個冒號後跟的是一個表達式,通常用於斷言失敗後的提示信息,說白了,它是一個傳到AssertionError構造函數的值,如果斷言失敗,該值被轉化爲它對應的字符串,並顯示出來。
2.3 Switch語句與枚舉及字符串結合
Switch接收的參數支持枚舉和字符串,如:
public int switchEnumTest(EnumTest e) {
switch (e) {
case FIR:
return 1;
case SED:
return 2;
}
return 0;
}
public enum EnumTest {
FIR,
SED,
TRD
}
2.4 可變參數
可變參數指方法接收參數時,可不確定參數個數,但可變參數必須是同一類型,且位於方法參數最後一位。本質上是一個數據,示例如下:
public void varargsTest(String ... arr) {
for (String s : arr) {
System.out.println(s);
}
}
2.5 自動裝箱拆箱
自動裝箱拆箱主要針對的是基本類型和對應的包裝類之間的自動轉換,但要注意,自動轉換在高併發場景下會影響性能。
public Double autoBoxingTest(Integer i, Double d) {
return d + i;
}
2.6 枚舉
枚舉可以固定一系列字符串數據選項,也可以使用枚舉來完成單例模式的實現,實例代碼如下:
public enum EnumTest {
FIR,
SED,
TRD
}
2.7 泛型擦出
泛型主要用於編譯器推導類型,在實際JVM中全部是object類型,這就是泛型的擦除。常見泛型如指定List裝載數據的類型,實例如下:
public void genericEraseTest() {
List<String> list = new ArrayList<String>();
}
2.8 增強for循環
for循環是開發中最常用的語句,而增強for循環可以更清晰明瞭的編寫循環代碼。
List<String> list = new ArrayList();
for (Object s : list) {
System.out.println(s);
}
2.9 lambda表達式
lambda涵蓋範圍比較大,可查閱之前寫的《Lambda實踐總結》
2.10 try-with-resources語句
在諸如進行數據庫連接、IO流創建讀取等常見,頻繁需要建立連接,釋放連接,如果未及時關閉,還可能會導致數據泄露,故Java提供了try-with-resource代碼塊,由java進行資源的建立和釋放,示例代碼如下:
try (final StringWriter writer = new StringWriter();
final StringWriter writer2 = new StringWriter()) {
writer.write("1");
writer2.write("2");
}
2.11 JDK10的局部變量類型推斷
類型推斷有點類似JavaScript的var語句,不用指定類型,由編譯器推導類型,示例代碼如下:
public void varTest() {
//初始化局部變量
var string = "123";
//初始化局部變量
var stringList = new ArrayList<String>();
stringList.add("4");
stringList.add("5");
stringList.add("6");
//增強for循環的索引
for (var s : stringList){
System.out.println(s);
}
//傳統for循環的局部變量定義
for (var i = 0; i < stringList.size(); i++){
System.out.println(stringList.get(i));
}
}
有興趣的大佬大神可以關注下小弟的微信公共號,一起學習交流,掃描以下二維碼關注即可。