Java8中新特性O(shè)ptional、接口中默認方法和靜態(tài)方法詳解
前言
毫無疑問,Java 8是Java自Java 5(發(fā)布于2004年)之后的最重要的版本。這個版本包含語言、編譯器、庫、工具和JVM等方面的十多個新特性。
Java 8是Java的一個重大版本,有人認為,雖然這些新特性領(lǐng)Java開發(fā)人員十分期待,但同時也需要花不少精力去學(xué)習(xí)。下面本文就給大家詳細介紹了Java8中新特性O(shè)ptional、接口中默認方法和靜態(tài)方法的相關(guān)內(nèi)容,話不多說了,來一起看看詳細的介紹吧。
Optional
Optional 類(java.util.Optional
) 是一個容器類,代表一個值存在或不存在,原來用 null 表示一個值不存在,現(xiàn)在 Optional 可以更好的表達這個概念。并且可以避免空指針異常。
常用方法:
Optional.of(T t)
: 創(chuàng)建一個 Optional 實例。Optional.empty()
: 創(chuàng)建一個空的 Optional 實例。Optional.ofNullable(T t)
若 t 不為 null,創(chuàng)建 Optional 實例,否則創(chuàng)建空實例。isPresent()
: 判斷是否包含值。orElse(T t)
: 如果調(diào)用對象包含值,返回該值,否則返回t。orElseGet(Supplier s)
:如果調(diào)用對象包含值,返回該值,否則返回 s 獲取的值。map(Function f)
如果有值對其處理,并返回處理后的Optional,否則返回Optional.empty()
flatMap(Function mapper)
與 map 類似,要求返回值必須是Optional。
下面引用ImportNew的一段內(nèi)容來告訴我們?nèi)绾握_使用Optional。比如千萬不要寫成這樣子:
public static String getName(User u) { Optional<User> user = Optional.ofNullable(u); if (!user.isPresent()) return "Unknown"; return user.get().name; }
這樣改寫非但不簡潔,而且其操作還是和第一段代碼一樣。無非就是用isPresent方法來替代u==null。這樣的改寫并不是Optional正確的用法,我們再來改寫一次。
public static String getName(User u) { return Optional.ofNullable(u) .map(user->user.name) .orElse("Unknown"); }
這樣才是正確使用Optional的姿勢。那么按照這種思路,我們可以安心的進行鏈?zhǔn)秸{(diào)用,而不是一層層判斷了??匆欢未a:
public static String getChampionName(Competition comp) throws IllegalArgumentException { if (comp != null) { CompResult result = comp.getResult(); if (result != null) { User champion = result.getChampion(); if (champion != null) { return champion.getName(); } } } throw new IllegalArgumentException("The value of param comp isn't available."); }
由于種種原因(比如:比賽還沒有產(chǎn)生冠軍、方法的非正常調(diào)用、某個方法的實現(xiàn)里埋藏的大禮包等等),我們并不能開心的一路comp.getResult().getChampion().getName()
到底。而其他語言比如kotlin,就提供了在語法層面的操作符加持:comp?.getResult()?.getChampion()?.getName()
所以講道理在Java里我們怎么辦!
讓我們看看經(jīng)過Optional加持過后,這些代碼會變成什么樣子。
public static String getChampionName(Competition comp) throws IllegalArgumentException { return Optional.ofNullable(comp) .map(c->c.getResult()) .map(r->r.getChampion()) .map(u->u.getName()) .orElseThrow(()->new IllegalArgumentException("The value of param comp isn't available.")); }
這就很舒服了。Optional的魅力還不止于此,Optional還有一些神奇的用法,比如Optional可以用來檢驗參數(shù)的合法性。
public void setName(String name) throws IllegalArgumentException { this.name = Optional.ofNullable(name).filter(User::isNameValid) .orElseThrow(()->new IllegalArgumentException("Invalid username.")); }
上面代碼引用importnew—Java8 如何正確使用 Optional。
接口中的默認方法與靜態(tài)方法
Java8接口中可以添加靜態(tài)方法,也可以添加默認方法,默認方法用 default修飾。
public interface Fun<T> { default void getName(){ System.out.println("hello world"); } static void getAge(){ System.out.println("nine"); } }
若一個接口中定義了一個默認方法,他的實現(xiàn)類的一個父類定義了具有相同名稱和參數(shù)列表的方法。則調(diào)用該實現(xiàn)類的時候執(zhí)行父類中的方法。
public class TestF { public void getName(){ System.out.println("TestF"); } } public interface TestInterface { default void getName(){ System.out.println("hello world"); } } public class Test extends TestF implements TestInterface{ public static void main(String[] args) { Test t = new Test(); t.getName();//輸出的是TestF } }
若一個實現(xiàn)類實現(xiàn)了兩個接口,如果一個父接口提供一個默認方法,而另一個父接口也提供了一個具有相同名稱和參數(shù)列表的方法(不管方法是否是默認方法),那么必須覆蓋該方法來解決沖突,否則會報錯。
public interface TestInterface { default void getName(){ System.err.println("hello world"); } } public interface TestInterface1 { void getName(); } public class Test1 implements TestInterface, TestInterface1{ public void getName(){ System.out.println("Tes1F"); } }
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
springboot controller參數(shù)注入方式
這篇文章主要介紹了springboot controller參數(shù)注入方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05java8快速實現(xiàn)List轉(zhuǎn)map 、分組、過濾等操作
這篇文章主要介紹了java8快速實現(xiàn)List轉(zhuǎn)map 、分組、過濾等操作,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09SpringBoot項目打成war和jar的區(qū)別說明
這篇文章主要介紹了SpringBoot項目打成war和jar的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06詳解Java使用雙異步后如何保證數(shù)據(jù)一致性
這篇文章主要為大家詳細介紹了Java使用雙異步后如何保證數(shù)據(jù)一致性,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以了解下2024-01-01JAVA演示阿里云圖像識別API,印刷文字識別-營業(yè)執(zhí)照識別
最近有由于工作需要,開始接觸阿里云的云市場的印刷文字識別API-營業(yè)執(zhí)照識別這里我加上了官網(wǎng)的申請說明,只要你有阿里云賬號就可以用,前500次是免費的,API說明很簡陋,只能做個簡單參考2019-05-05Spring切面優(yōu)先級與基于xml的AOP實現(xiàn)方法詳解
這篇文章主要介紹了Spring切面的優(yōu)先級與基于xml的AOP的詳細步驟,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-11-11