java語法糖之jdk迭代的新特性匯總
語法糖(Syntactic sugar)
是由英國計(jì)算機(jī)科學(xué)家彼得·約翰·蘭達(dá)(Peter J. Landin)發(fā)明的一個(gè)術(shù)語,指計(jì)算機(jī)語言中添加的某種語法,這種語法對語言的功能并沒有影響,但是更方便程序員使用。通常來說使用語法糖能夠增加程序的可讀性,從而減少程序代碼出錯(cuò)的機(jī)會。
糖1:for-each
功能和傳統(tǒng)的fori相似
代碼樣例
public class Test { public static void main(String[] args) { int[] num = new int[10]; for (int i = 0; i < 10; i++) { num[i] = i; } //舊版本 for (int i = 0; i < num.length; i++) { System.out.print(num[i]+" "); } System.out.println(); //新版本 for (int i:num) { System.out.print(num[i]+" "); } } }
輸出對比
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
特性
- for-each從JDK5.0開始引入
- for-each語法更加簡潔
- for-each可以避免語法越界錯(cuò)誤
- fori可以刪除元素,for-each不可以
- for-each遍歷時(shí)候不知道當(dāng)前元素的具體位置
- for-each只能正向遍歷,不能反向遍歷
- for-each不能同時(shí)遍歷兩個(gè)集合
糖2:枚舉類型
變量的取值只在一個(gè)有限的集合里面
代碼樣例
public class Test { public static void main(String[] args) { enum Size{ SMALL,MEDIUM,LARGE; } Size s1 = Size.SMALL; Size s2 = Size.MEDIUM; Size s3 = Size.LARGE; Size s4 = Size.SMALL; System.out.println(s1==s4); System.out.println(s3==s4); } }
輸出樣例
true
false
特性
- enum聲明枚舉類,且都是Enum的 子類
- enum內(nèi)部有多少個(gè)值,就有多少個(gè)實(shí)例對象
- 不能直接new枚舉類對象
- 除了枚舉的內(nèi)容 ,還可以添加屬性,方法 ,構(gòu)造函數(shù)
- 構(gòu)造函數(shù)只能是private類型,只能內(nèi)部調(diào)用
- enum也繼承了Enum的子類,也繼承了相應(yīng)方法
- ordinal()返回枚舉值所在的索引位置
- compareTo()比較兩個(gè)枚舉值的索引位置大小
- toString()放回枚舉值的字符串表示
- valueOf()將字符串初始化為枚舉對象
- values()返回所有的枚舉值
糖3:不定項(xiàng)參數(shù)
普通函數(shù)的形參列表是固定個(gè)數(shù)/類型/順序
JDK5.0提供了不定項(xiàng)參數(shù)(可變參數(shù))功能
代碼樣例
public class Test { public static void main(String[] args) { test("aaa"); test("aaa","bbb","ccc"); } public static void test(String... args){ System.out.println(args.length); for (String arg:args) { System.out.println(arg); } } }
輸出樣例
1
aaa
3
aaa
bbb
ccc
特性
- 類型后面加…表示,如代碼樣例所示
- 可變參數(shù),實(shí)際上是一個(gè)數(shù)組
- 一個(gè)方法只能有一個(gè)不定項(xiàng)參數(shù),且必須位于參數(shù)列表的最后
- 優(yōu)先規(guī)則1:固定參數(shù)的方法比可變參數(shù)優(yōu)先級更高
- 優(yōu)先規(guī)則2:調(diào)用語句,同時(shí)與兩個(gè)帶可變參數(shù)的方法匹配,則報(bào)錯(cuò)
糖4:靜態(tài)導(dǎo)入
import導(dǎo)入程序所需要的類
import static導(dǎo)入一個(gè)類的靜態(tài)方法和靜態(tài)常量(JDK5.0引入)
代碼樣例
import static java.lang.Math.pow; import static java.lang.Math.sqrt; import static java.lang.System.out; public class Test { public static void main(String[] args) { int a=3,b=4,c=0; //靜態(tài)引入 c = (int) sqrt(pow(a,2)+pow(b,2)); //原本用法 c = (int) Math.sqrt(Math.pow(a,2)+Math.pow(b,2)); //靜態(tài)引入 out.println(c); //原本用法 System.out.println(c); } }
輸出樣例
5
5
特性
- 可以省略類名,直接用
- 靜態(tài)方法具有明確特征,如有重名,需要補(bǔ)充類名
- 通配符:*
糖5:自動裝箱和拆箱
在java中,基本類型放在棧里面,對象則是在堆里開辟了內(nèi)存空間,把對象的引用存入棧里面,基本類型可以包含在對象里面,所以形象的形容為裝箱
從JDK5.0開始引入,簡化了基本類型和對象轉(zhuǎn)化的寫法
基本類型:boolean/byte/char/int/short/long/float/double
對象:Boolean/Byte/Character/Integer/Short/Long/Float/Double
代碼樣例
public class Test { public static void main(String[] args) { //自動裝箱 Integer obj1 = 5; //原始用法 Integer obj2 = Integer.valueOf(5); //自動拆箱 int a1 = obj1; //原始用法 int a2 = obj2.intValue(); System.out.println(obj1); System.out.println(a1); System.out.println(obj2); System.out.println(a2); } }
輸出樣例
5
5
5
5
特性
- 裝箱和拆箱都是編譯器的工作,在class中已經(jīng)添加轉(zhuǎn)化,虛擬機(jī)中沒有自動拆箱和裝箱的語句
- 對于==:基本類型是內(nèi)容相同,對象是指針是否相同(內(nèi)存同一個(gè)區(qū)域)
- 基本類型沒有空值,對象有null,可能引發(fā)NullPointerException
- 當(dāng)一個(gè)基礎(chǔ)數(shù)據(jù)類型與封裝類型進(jìn)行==,+,-,*,/運(yùn)算時(shí),會將封裝類進(jìn)行拆箱,對基本數(shù)據(jù)類型進(jìn)行運(yùn)算
- 謹(jǐn)慎使用多個(gè)非同類的數(shù)值類對象進(jìn)行運(yùn)算
糖6:多異常并列
多個(gè)異常并列在一個(gè)catch中
從JDK7.0Y引入,簡化寫法
代碼樣例
import java.io.IOException; import java.sql.SQLException; public class Test { public static void main(String[] args) { //舊版本 try { test(); } catch (IOException ex){ //異常處理 } catch (SQLException ex){ //異常處理 } //新版本 try { test(); } catch (IOException | SQLException ex){ //異常處理 } } private static void test() { } }
特性
- 并列的特性不能直接有或間接有繼承關(guān)系,如果有,則報(bào)錯(cuò)
糖7:整數(shù)類型用二進(jìn)制賦值
從JDK7.0開始引入
整數(shù)類型可以用二進(jìn)制進(jìn)行賦值
代碼樣例
public class Test { public static void main(String[] args) { byte a1 = (byte) 0b00100001; short a2 = (short) 0b10101010101; int a3 = 0b101; long a4 = 0b101010101011011011010101011L; System.out.println(a1); System.out.println(a2); System.out.println(a3); System.out.println(a4); } }
輸出樣例
33
1365
5
89503403
特性
- 避免二進(jìn)制計(jì)算
- 0b表示二進(jìn)制數(shù)
糖8:數(shù)字中的下劃線
從JDK7.0開始引入
在數(shù)字字面量中使用下劃線
代碼樣例
public class Test { public static void main(String[] args) { //二進(jìn)制,0b開頭 int a1 = 0b0100_1011_0001; //八進(jìn)制,0開頭 int a2 = 02_014; int a3 = 123__45; //十六進(jìn)制,0x開頭 int a4 = 0x7_567; float a5 = 3.56_78f; System.out.println(a1); System.out.println(a2); System.out.println(a3); System.out.println(a4); System.out.println(a5); } }
輸出樣例
1201
1036
12345
30055
3.5678
特性
- 增加數(shù)字的可讀性和糾錯(cuò)功能
- 下劃線只能出現(xiàn)在數(shù)字中間,前后必須有數(shù)字
- 下劃線不能拆開0x
- 允許在二/八/十/十六進(jìn)制中使用
- 可以使用多個(gè)下劃線
糖9:接口的默認(rèn)方法
java最初的設(shè)計(jì)中,接口的方法都是沒有實(shí)現(xiàn)的公開的
JDK8.0推出接口的默認(rèn)方法/靜態(tài)方法(都帶實(shí)現(xiàn)的),為Lambda表達(dá)式提供支持
代碼樣例
public class Test { public interface Animal{ public void move(); } public interface NewAnimal{ public default void move(){ System.out.println("I can move"); }; } }
特性
- 用default關(guān)鍵字標(biāo)注,其他的定義和普通函數(shù)一樣
- 默認(rèn)方法不能重寫Object中的方法
- 實(shí)現(xiàn)類可以繼承/重新父接口的默認(rèn)方法
- 接口可以繼承/重新父接口的默認(rèn)方法
- 當(dāng)父類和父接口都有同名同參數(shù)的默認(rèn)方法的時(shí)候,子類繼承父類的默認(rèn)方法,這樣可以兼容JDK7.0以前的代碼
- 子類實(shí)現(xiàn)了兩個(gè)接口(同名同參),那么編譯失敗,必須在子類中重寫這個(gè)default方法
糖10:接口的靜態(tài)方法
JDK8.0推出帶實(shí)現(xiàn)的靜態(tài)方法
代碼樣例
public class Test { public interface StaticAnimal{ public static void move(){ System.out.println("I can move"); } } public interface StaticLandAnimal extends StaticAnimal{ //繼承不到StaticAnimal的move方法 } public static void main(String[] args) { //正確引用 StaticAnimal.move(); //錯(cuò)誤引用 StaticLandAnimal.move(); new StaticAnimal().move(); } }
特性
- 該靜態(tài)方法屬于本接口,不屬于子類/子接口
- 子類(子接口)沒有繼承該靜態(tài)方法,只能通過所在的接口名來調(diào)用
糖11:接口的私有方法
JDK9.0推出接口的私有方法
代碼樣例
public class Test { public interface StaticAnimal{ private void move(){ System.out.println("I can move"); } } public interface StaticLandAnimal extends StaticAnimal{ //繼承不到StaticAnimal的move方法 } public static void main(String[] args) { //錯(cuò)誤引用 StaticAnimal.move(); StaticLandAnimal.move(); new StaticAnimal().move(); } }
特性
- 解決多個(gè)默認(rèn)方法/靜態(tài)方法的內(nèi)容重復(fù)問題
- 私有方法屬于本接口,只能在本接口內(nèi)使用,不屬于子類/子接口
- 子類(子接口)沒有繼承該私有方法,也無法調(diào)用
- 靜態(tài)私有方法可以被靜態(tài)/默認(rèn)方法調(diào)用,非靜態(tài)私有方法被默認(rèn)方法調(diào)用
糖12:try-with-resource
程序如果打開外部資源,那么使用后必須正確關(guān)閉
考慮異常因素,java提供try-catch-finally進(jìn)行保證
JDK7.0提供try-with-resour,比try-catch-finally更加方便
代碼樣例
public class Test implements AutoCloseable { private int age = 18; @Override public void close() throws Exception { System.out.println("關(guān)閉成功"); } public static void main(String[] args) { try(Test11 OpenResource = new Test()){ System.out.println(OpenResource.age); } catch (Exception e) { e.printStackTrace(); } } }
輸出樣例
18
關(guān)閉成功
特性
- 資源對象必須實(shí)現(xiàn)AutoCloseable接口,即實(shí)現(xiàn)close方法
- 在try-catch塊執(zhí)行后會自動執(zhí)行close方法
- JDK7要求定義臨時(shí)變量接收
Test OpenResource = new Test();
try(Test TT = OpenResource)… - JDK9不在要求定義臨時(shí)變量,可以直接使用
Test OpenResource = new Test();
try(OpenResource)…
糖13:ResourceBundle文件加載
JDK8及以前,ResourceBundle默認(rèn)以ISO-8859-1方式加載文件
JDK9及以后,ResourceBundle默認(rèn)以UTF-8方式加載文件
糖14:var類型
java以前一直是一種強(qiáng)類型的語言
每個(gè)變量在定義時(shí)候就確定了類型
JDK10推出了var:局部變量推斷
代碼樣例
public class Test { public static void main(String[] args) { var a1 = 5; var a2 = 0.025f; var a3 = "abc"; int b1 = 5; float b2 = 0.025f; String b3 = "abc"; System.out.println(a1==b1); System.out.println(a2==b2); System.out.println(a3==b3); } }
輸出樣例
true
true
true
特性
- 避免了信息冗余
- 對齊了變量名
- 更容易閱讀
- var可以用在局部變量上,非類成員變量
- var可以用在for/for-each循環(huán)中
- 聲明時(shí)必須初始化
- 不能用在方法形參和返回類型
- 大面積濫用會導(dǎo)致代碼整體閱讀性變差
- var只在編譯時(shí)起作用,沒有在字節(jié)碼中引入新的內(nèi)容,也沒有專門的JVM指令處理war
糖15:switch分支合并
JDK12推出
代碼樣例
public class Test { public static void main(String[] args) { String month = null; int result; switch (month){ case "Jan","Mar","July","Aug","Oct","Dec" -> result = 31; case "Apr","June","Sep","Nov" -> result = 30; case "Feb" -> result = 28; default -> result = -1; } } }
總結(jié)
到此這篇關(guān)于java語法糖之jdk迭代新特性的文章就介紹到這了,更多相關(guān)jdk迭代新特性內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring data jpa 查詢自定義字段,轉(zhuǎn)換為自定義實(shí)體方式
這篇文章主要介紹了spring data jpa 查詢自定義字段,轉(zhuǎn)換為自定義實(shí)體方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06SpringBoot使用SensitiveWord實(shí)現(xiàn)敏感詞過濾
這篇文章主要為大家詳細(xì)介紹了SpringBoot如何使用SensitiveWord實(shí)現(xiàn)敏感詞過濾功能,文中示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-01-01java 中 String format 和Math類實(shí)例詳解
這篇文章主要介紹了java 中 String format 和Math類實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06java進(jìn)行遠(yuǎn)程部署與調(diào)試及原理詳解
這篇文章主要介紹了java進(jìn)行遠(yuǎn)程部署與調(diào)試及原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12Java 精煉解讀數(shù)據(jù)結(jié)構(gòu)邏輯控制
在程序開發(fā)的過程之中一共會存在有三種程序邏輯:順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu),對于之前所編寫的代碼大部分都是順序結(jié)構(gòu)的定義,即:所有的程序?qū)凑斩x的代碼順序依次執(zhí)行2022-03-03Java實(shí)現(xiàn)多線程輪流打印1-100的數(shù)字操作
這篇文章主要介紹了Java實(shí)現(xiàn)多線程輪流打印1-100的數(shù)字操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08解決引用slf4j中Logger.info只打印出文字沒有數(shù)據(jù)的問題
這篇文章主要介紹了解決引用slf4j中Logger.info只打印出文字沒有數(shù)據(jù)的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12Java連接PostgreSql數(shù)據(jù)庫及基本使用方式
這篇文章主要介紹了Java連接PostgreSql數(shù)據(jù)庫及基本使用方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03