最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java8中新特性O(shè)ptional、接口中默認(rèn)方法和靜態(tài)方法詳解

 更新時間:2017年12月28日 09:19:14   作者:我不是李大俠  
Java 8 已經(jīng)發(fā)布很久了,很多報道表明Java 8 是一次重大的版本升級。下面這篇文章主要給大家介紹了關(guān)于Java8中新特性O(shè)ptional、接口中默認(rèn)方法和靜態(tài)方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。

前言

毫無疑問,Java 8是Java自Java 5(發(fā)布于2004年)之后的最重要的版本。這個版本包含語言、編譯器、庫、工具和JVM等方面的十多個新特性。

Java 8是Java的一個重大版本,有人認(rèn)為,雖然這些新特性領(lǐng)Java開發(fā)人員十分期待,但同時也需要花不少精力去學(xué)習(xí)。下面本文就給大家詳細(xì)介紹了Java8中新特性O(shè)ptional、接口中默認(rèn)方法和靜態(tài)方法的相關(guān)內(nèi)容,話不多說了,來一起看看詳細(xì)的介紹吧。

Optional

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

常用方法:

  • 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的姿勢。那么按照這種思路,我們可以安心的進(jìn)行鏈?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。

接口中的默認(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");
 }
}

若一個接口中定義了一個默認(rèn)方法,他的實現(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)了兩個接口,如果一個父接口提供一個默認(rèn)方法,而另一個父接口也提供了一個具有相同名稱和參數(shù)列表的方法(不管方法是否是默認(rèn)方法),那么必須覆蓋該方法來解決沖突,否則會報錯。

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中使用Thymeleaf模板詳情

    SpringBoot中使用Thymeleaf模板詳情

    這篇文章主要介紹了SpringBoot中使用Thymeleaf模板詳情,hymeleaf是適用于Web和獨立環(huán)境的現(xiàn)代服務(wù)器端Java模板引擎,能夠處理HTML,XML,JavaScript,CSS甚至純文本,下文更多相關(guān)資料介紹需要的小伙伴可以參考一下
    2022-04-04
  • 一文詳解Spring Security的基本用法

    一文詳解Spring Security的基本用法

    Spring Security是一個功能強(qiáng)大且高度可定制的身份驗證和訪問控制框架, 提供了完善的認(rèn)證機(jī)制和方法級的授權(quán)功能。本文將通過一個簡單的案例了解一下Spring Security的基本用法,需要的可以參考一下
    2022-05-05
  • idea中Java實體類怎樣生成序列化的版本號的方法

    idea中Java實體類怎樣生成序列化的版本號的方法

    這篇文章主要介紹了idea中Java實體類怎樣生成序列化的版本號的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • SpringBoot實現(xiàn)國際化過程詳解

    SpringBoot實現(xiàn)國際化過程詳解

    這篇文章主要介紹了SpringBoot實現(xiàn)國際化過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • IDEA性能優(yōu)化方法解決卡頓問題

    IDEA性能優(yōu)化方法解決卡頓問題

    本文主要介紹了如何在不升級電腦配置的情況下通過修改IntelliJIDEA的設(shè)置來優(yōu)化其性能,從而提升開發(fā)效率
    2024-12-12
  • 使用Spring和Redis創(chuàng)建處理敏感數(shù)據(jù)的服務(wù)的示例代碼

    使用Spring和Redis創(chuàng)建處理敏感數(shù)據(jù)的服務(wù)的示例代碼

    許多公司處理的用戶敏感數(shù)據(jù)由于法律限制不能永久存儲,根據(jù)規(guī)定,這些數(shù)據(jù)的存儲時間不能超過預(yù)設(shè)期限,并且最好在用于服務(wù)目的之后就將其刪除,解決這個問題有多種可能的方案,在本文中,我想展示一個利用 Spring 和 Redis 處理敏感數(shù)據(jù)的應(yīng)用程序的簡化示例
    2025-04-04
  • spring-boot List轉(zhuǎn)Page的方法步驟

    spring-boot List轉(zhuǎn)Page的方法步驟

    這篇文章主要介紹了spring-boot List轉(zhuǎn)Page的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • swing中Tree與滾動條用法實例分析

    swing中Tree與滾動條用法實例分析

    這篇文章主要介紹了swing中Tree與滾動條用法,以實例形式分析了java基于swing實現(xiàn)圖形界面的使用技巧,需要的朋友可以參考下
    2015-09-09
  • JAVA中反射機(jī)制和模塊化的深入講解

    JAVA中反射機(jī)制和模塊化的深入講解

    很多剛學(xué)Java反射的同學(xué)可能對反射技術(shù)一頭霧水,為什么要學(xué)習(xí)反射,學(xué)習(xí)反射有什么作用,下面這篇文章主要給大家介紹了關(guān)于JAVA中反射機(jī)制和模塊化的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • 出現(xiàn)log.info報紅的解決方案

    出現(xiàn)log.info報紅的解決方案

    這篇文章主要介紹了出現(xiàn)log.info報紅的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06

最新評論

高密市| 喀喇| 和顺县| 绥德县| 洛扎县| 阳城县| 炉霍县| 平度市| 昭平县| 北川| 桓台县| 成都市| 彰化市| 汪清县| 铅山县| 云阳县| 道孚县| 丹凤县| 卓尼县| 紫云| 长兴县| 顺平县| 阿尔山市| 山阴县| 城市| 绥中县| 天峻县| 哈密市| 英德市| 五常市| 达尔| 越西县| 林州市| 富裕县| 岗巴县| 邵武市| 敖汉旗| 台前县| 西乌珠穆沁旗| 汽车| 舞阳县|