日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Java空指針檢查實在看不下去了——轉用Optional真香

來源: 責編: 時間:2023-11-14 09:09:12 271觀看
導讀前言在Java開發中,空指針是程序員遇到的最多的異常之一(特別是剛接觸java開發的),對于對象中的某個屬性,有時候我們為了避免程序報空指針錯誤,而不得不使用較多的if、else來進行邏輯判斷,但這樣的話代碼可能就會比較冗余或者

wYW28資訊網——每日最新資訊28at.com

前言

在Java開發中,空指針是程序員遇到的最多的異常之一(特別是剛接觸java開發的),對于對象中的某個屬性,有時候我們為了避免程序報空指針錯誤,而不得不使用較多的if、else來進行邏輯判斷,但這樣的話代碼可能就會比較冗余或者說不夠優雅。雖然我們大部分程序員是有責任心的,不會坐視不管,于是就有了大量的 null 值檢查。盡管有時候這種檢查完全沒有必要,但我們已經習慣了例行公事。終于Java 8 看不下去了,就引入了 Optional,以便我們編寫的代碼不再那么呆板。wYW28資訊網——每日最新資訊28at.com

NPE問題

NPE問題就是我們在開發中經常碰到的NullPointerException.假設我們有兩個類,他們的UML類圖如下圖所示:wYW28資訊網——每日最新資訊28at.com

wYW28資訊網——每日最新資訊28at.com

現在需要訪問用戶地址信息的省份,簡單代碼為:user.getAddress().getProvince();wYW28資訊網——每日最新資訊28at.com

在這種寫法中,當user為null時,是有可能報NPE異常的。為了解決這個問題,于是采用下面的寫法:wYW28資訊網——每日最新資訊28at.com

public String OptGetProvince(User user){      if(user!=null){          Address address = user.getAddress();          if(address!=null){              String province = address.getProvince();              return province;          }          return "none";      }}

這種寫法是比較繁瑣的,為了避免上述丑陋的寫法。于是JAVA8提供了Optional類來優化這種寫法:wYW28資訊網——每日最新資訊28at.com

public String OptGetProvince(User user){        return Optional.ofNullable(user)                .map(s -> s.getAddress())                .map(a -> a.getProvince())                .orElse("none");    }

可以看到,通過Optional的使用,可以很好的解決if以及嵌套判空的問題,使得整體的判斷變得清爽簡潔多了。wYW28資訊網——每日最新資訊28at.com

Optional使用

我們可以把Optional類看成是一個容器,我們將對象存儲到容器中后,通過調用內置的API,可以較為安全地過濾掉可能存在的空指針問題,避免繁瑣嵌套的if、else操作,讓我們的代碼盡可能的簡潔。API主要分5個大類。wYW28資訊網——每日最新資訊28at.com

wYW28資訊網——每日最新資訊28at.com

構造函數: empty,of,ofNullable

empty返回一個空的Optional對象。wYW28資訊網——每日最新資訊28at.com

Optional.empty();

of根據傳入的值生成Optional對象。wYW28資訊網——每日最新資訊28at.com

// 方式2 將非空對象作為屬性傳入Optional類中User u = new User("小明",16); Optional.of(u.getAddress());

ofNullable 和of方法一樣,根據傳入的值生成optional對象。wYW28資訊網——每日最新資訊28at.com

// 方式3 將非空對象作為屬性傳入Optional類中 User u = new User("小明",16); Optional.ofNullable(u.getAddress());

of和ofNullable的作用很相近,從Optional類的源代碼看的話,可以發現對于ofNullable方法的話是有進行判空的。也就是說,如果使用of方法傳入的參數是null,同樣會報空指針。wYW28資訊網——每日最新資訊28at.com

wYW28資訊網——每日最新資訊28at.com

值選擇方法:orElse,orElseGet和orElseThrow

這三個方法相當于SQL中的IFNULL函數,若Optional中值為null,則返回給定的默認值。wYW28資訊網——每日最新資訊28at.com

orElse

User s = new User("小明",16,new Address());String result = Optional.ofNullable(s.getAddress().getProvince()).orElse("深圳");

orElseGet

User s = new User("小明",16,new Address());String result = Optional.ofNullable(s.getAddress().getProvince()).orElseGet(()->"深圳");

orElseThrow

User s = new User("小明",16,new Address());String s3 = Optional.ofNullable(s.getAddress().getProvince()).orElseThrow(() -> new IllegalArgumentException("缺少參數"));

對于orElseThrow和orElseGet兩個方法,是采用函數式接口的方式來作為參數的。同時,對于orElse和orElseGet兩個方法,作用相近,區別是若Optional對象中的值不為空,則orElseGet不會創建參數中的對象,而orElse無論什么情況都會創建參數對象。wYW28資訊網——每日最新資訊28at.com

判空函數:isPresent和ifPresent

兩個函數的用法類似,都可以用作判空,區別在于當不為空時,ifPresent會執行對應的函數。wYW28資訊網——每日最新資訊28at.com

isPresent

User user = new User("小明",16,new Address());boolean b1 = Optional.ofNullable(user.getAddress()).isPresent();System.out.println(b1);  // true

ifPresent

User user = new User("小明",16,new Address());Optional.ofNullable(user.getAddress()).ifPresent(address -> System.out.println(address));

值轉換函數:map和flagMap

值轉換的就是對Optional對象中的value值進行轉換,對值應用(調用)作為參數的函數,然后將返回的值包裝在 Optional中wYW28資訊網——每日最新資訊28at.com

map

User user = new User("小明",16,new Address());String s1 = Optional.ofNullable(user).map(s -> s.getName()).get();

flagMap

User user = new User("小明",16,new Address());String s1 = Optional.ofNullable(user).flatMap(s -> s.getName()).get();

兩個函數都可以實現值的轉換,兩者的區別是二者的入參不同。以上面的flagMap的示例代碼為例,我們需要在User類中重寫一下getName方法,使其返回Optional對象。wYW28資訊網——每日最新資訊28at.com

過濾(篩選)函數:filter

該函數的作用是,判斷Optional中的值是否滿足指定條件,若滿足則返回,否則返回一個EMPTY對象。wYW28資訊網——每日最新資訊28at.com

User user = new User("小明",16,new Address());User result = Optional.ofNullable(user).filter(s -> s.getName().equals("小紅")).orElseGet(() ->new User("小藍",10));System.out.println(result); // user{address=null, name='小藍', age=10}

這里會篩選出滿足姓名為小紅的User對象,若不滿足則新建一個姓名為小藍的User對象。wYW28資訊網——每日最新資訊28at.com

最后

需要注意,使用Optonal這種鏈式編程雖然簡潔化了程序代碼,但是邏輯性不是很明顯,相對來說會損失一定的代碼可讀性,具體的使用需要開發人員在實際場景中進行權衡。個人建議哪怕是自己不經常使用也要盡量掌握,避免出現閱讀源碼的時候顯得尷尬。wYW28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-24298-0.htmlJava空指針檢查實在看不下去了——轉用Optional真香

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Scylla數據庫-高性能的分布式數據庫

下一篇: 掌握Python的高級函數:提升代碼的靈活性和可讀性

標簽:
  • 熱門焦點
  • K60至尊版狂暴引擎2.0加持:超177萬跑分斬獲性能第一

    Redmi的后性能時代戰略發布會今天下午如期舉辦,在本次發布會上,Redmi公布了多項關于和聯發科的深度合作,以及新機K60 Ultra在軟件和硬件方面的特性,例如:“K60 至尊版,雙芯旗艦
  • 6月iOS設備好評榜:第一蟬聯榜首近一年

    作為安兔兔各種榜單里變化最小的那個,2023年6月的iOS好評榜和上個月相比沒有任何排名上的變化,僅僅是部分設備好評率的下降,長年累月的用戶評價和逐漸退出市場的老款機器讓這
  • 消息稱迪士尼要拍真人版《魔發奇緣》:女主可能也找黑人演員

    8月5日消息,迪士尼確實有點忙,忙著將不少動畫改成真人版,繼《美人魚》后,真人版《白雪公主》、《魔發奇緣》也在路上了。據外媒消息稱,迪士尼將打造真人版
  • K6:面向開發人員的現代負載測試工具

    K6 是一個開源負載測試工具,可以輕松編寫、運行和分析性能測試。它建立在 Go 和 JavaScript 之上,它被設計為功能強大、可擴展且易于使用。k6 可用于測試各種應用程序,包括 Web
  • 多線程開發帶來的問題與解決方法

    使用多線程主要會帶來以下幾個問題:(一)線程安全問題  線程安全問題指的是在某一線程從開始訪問到結束訪問某一數據期間,該數據被其他的線程所修改,那么對于當前線程而言,該線程
  • 一文搞定Java NIO,以及各種奇葩流

    大家好,我是哪吒。很多朋友問我,如何才能學好IO流,對各種流的概念,云里霧里的,不求甚解。用到的時候,現百度,功能雖然實現了,但是為什么用這個?不知道。更別說效率問題了~下次再遇到,
  • 雅柏威士忌多款單品價格大跌,泥煤頂流也不香了?

    來源 | 烈酒商業觀察編 | 肖海林今年以來,威士忌市場開始出現了降溫跡象,越來越多不斷暴漲的網紅威士忌也開始悄然回歸市場理性。近日,LVMH集團旗下蘇格蘭威士忌品牌雅柏(Ardbeg
  • 共享單車的故事講到哪了?

    來源丨海克財經與共享充電寶相差不多,共享單車已很久沒有被國內熱點新聞關照到了。除了一再漲價和用戶直呼用不起了。近日多家媒體再發報道稱,成都、天津、鄭州等地多個共享單
  • 聯想的ThinkBook Plus下一版曝光,鍵盤旁邊塞個平板

    ThinkBook Plus 是聯想的一個特殊筆記本類別,它在封面放入了一塊墨水屏,也給人留下了較為深刻的印象。據有人爆料,聯想的下一款 ThinkBook Plus 可能更特殊,它
Top 主站蜘蛛池模板: 耿马| 莆田市| 兴安县| 邹城市| 商丘市| 福海县| 汽车| 健康| 普兰县| 商南县| 湘潭县| 龙泉市| 米脂县| 衡东县| 栾城县| 平山县| 宜黄县| 乌兰县| 建昌县| 宁远县| 隆安县| 和平区| 济宁市| 庐江县| 内乡县| 洛阳市| 化州市| 林甸县| 武穴市| 黄冈市| 绍兴县| 绥中县| 区。| 驻马店市| 平远县| 当阳市| 双城市| 灵武市| 灌云县| 香港| 鹿泉市|