日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java8新特性Optional、接口中的默认方法与静态方法

發(fā)布時(shí)間:2025/4/9 java 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java8新特性Optional、接口中的默认方法与静态方法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Optional

Optional 類(java.util.Optional) 是一個(gè)容器類,代表一個(gè)值存在或不存在,原來(lái)用 null 表示一個(gè)值不存在,現(xiàn)在 Optional 可以更好的表達(dá)這個(gè)概念。并且可以避免空指針異常。

常用方法:

Optional.of(T t) : 創(chuàng)建一個(gè) Optional 實(shí)例。

Optional.empty() : 創(chuàng)建一個(gè)空的 Optional 實(shí)例。

Optional.ofNullable(T t):若 t 不為 null,創(chuàng)建 Optional 實(shí)例,否則創(chuàng)建空實(shí)例。

isPresent() : 判斷是否包含值。

orElse(T t) : 如果調(diào)用對(duì)象包含值,返回該值,否則返回t。

orElseGet(Supplier s) :如果調(diào)用對(duì)象包含值,返回該值,否則返回 s 獲取的值。

map(Function f): 如果有值對(duì)其處理,并返回處理后的Optional,否則返回 Optional.empty()。

flatMap(Function mapper):與 map 類似,要求返回值必須是Optional。

下面引用ImportNew的一段內(nèi)容來(lái)告訴我們?nèi)绾握_使用Optional。比如千萬(wàn)不要寫成這樣子:

public static String getName(User u) {Optional<User> user = Optional.ofNullable(u);if (!user.isPresent())return "Unknown";return user.get().name; }

這樣改寫非但不簡(jiǎn)潔,而且其操作還是和第一段代碼一樣。無(wú)非就是用isPresent方法來(lái)替代u==null。這樣的改寫并不是Optional正確的用法,我們?cè)賮?lái)改寫一次。

public static String getName(User u) { return Optional.ofNullable(u) .map(user->user.name) .orElse("Unknown"); }

這樣才是正確使用Optional的姿勢(shì)。那么按照這種思路,我們可以安心的進(jìn)行鏈?zhǔn)秸{(diào)用,而不是一層層判斷了。看一段代碼:

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."); }

由于種種原因(比如:比賽還沒(méi)有產(chǎn)生冠軍、方法的非正常調(diào)用、某個(gè)方法的實(shí)現(xiàn)里埋藏的大禮包等等),我們并不能開(kāi)心的一路comp.getResult().getChampion().getName()到底。而其他語(yǔ)言比如kotlin,就提供了在語(yǔ)法層面的操作符加持:comp?.getResult()?.getChampion()?.getName()。所以講道理在Java里我們?cè)趺崔k!

讓我們看看經(jīng)過(guò)Optional加持過(guò)后,這些代碼會(huì)變成什么樣子。

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可以用來(lái)檢驗(yàn)參數(shù)的合法性。

public void setName(String name) throws IllegalArgumentException {this.name = Optional.ofNullable(name).filter(User::isNameValid).orElseThrow(()->new IllegalArgumentException("Invalid username.")); }

上面代碼引用importnew—Java8 如何正確使用 Optional。

接口中的默認(rèn)方法與靜態(tài)方法

Java8接口中可以添加靜態(tài)方法,也可以添加默認(rèn)方法,默認(rèn)方法用 default修飾。

public interface Fun<T> { default void getName(){ System.out.println("hello world"); } static void getAge(){ System.out.println("nine"); } }

若一個(gè)接口中定義了一個(gè)默認(rèn)方法,他的實(shí)現(xiàn)類的一個(gè)父類定義了具有相同名稱和參數(shù)列表的方法。則調(diào)用該實(shí)現(xiàn)類的時(shí)候執(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 } }

若一個(gè)實(shí)現(xiàn)類實(shí)現(xiàn)了兩個(gè)接口,如果一個(gè)父接口提供一個(gè)默認(rèn)方法,而另一個(gè)父接口也提供了一個(gè)具有相同名稱和參數(shù)列表的方法(不管方法是否是默認(rèn)方法),那么必須覆蓋該方法來(lái)解決沖突,否則會(huì)報(bào)錯(cuò)。

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"); } }
java學(xué)習(xí)群669823128

轉(zhuǎn)載于:https://www.cnblogs.com/rese-t/p/7977605.html

總結(jié)

以上是生活随笔為你收集整理的Java8新特性Optional、接口中的默认方法与静态方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。