精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Java 中 NullPointerException 的完美解決方案

開發 前端
我相信所有的Java程序猿一定都遇到過 NullPointerException ,空指針在Java程序中是最常見的,也是最煩人的;它讓我們很多程序猿產生了根深蒂固的感覺,所有可能產生空指針的地方都得加上 if-else 檢查,但是這帶給我們很多麻煩。

null在Java中帶來的麻煩

我相信所有的Java程序猿一定都遇到過 NullPointerException ,空指針在Java程序中是最常見的,也是最煩人的;它讓我們很多程序猿產生了根深蒂固的感覺,所有可能產生空指針的地方都得加上 if-else 檢查,但是這帶給我們很多麻煩。

  • Java本身是強類型的,但是null破壞了這個規則,它可以被賦值給任何對象

  • Java的設計是讓程序猿對指針無感知,但是null指針是個例外

  • 它會是代碼變得很臃腫,到處都充斥著 if-else 的空檢查,甚至是多層嵌套,代碼可讀性下降
  • null本身毫無意義,表示不了 

前兩點不需要特別的說明,后兩點舉個例子來說明一下:假如一個人擁有一個手機,每個手機都有生成廠商,每個廠商都會有個名字,用類表示的話:

  1. public class Person { 
  2.     private Phone phone; 
  3.  
  4.     public Phone getPhone() { 
  5.         return phone; 
  6.     } 
  7.  
  8. public class Phone { 
  9.     private Producer producer; 
  10.  
  11.     public Producer getProducer() { 
  12.         return producer; 
  13.     } 
  14.  
  15. public class Producer { 
  16.     private String name; 
  17.  
  18.     public String getName() { 
  19.         return name; 
  20.     } 

在這個例子中,假如我們需要取到手機生成廠商的名字

  1. public String getPhoneProducerName(Person person) { 
  2.     return person.getPhone().getProducer().getName(); 

由于不一定每個人都會有一個手機,所有在調用 getProducer() 時可能會出現 NullPointerException 。

一門設計語言本來就是來描述世界的,在這個事例中有的人有手機,有的人也可能沒有手機,所以在調用 person.getPhone() 返回的值就應該包含有和無這兩種情況,現在通過返回 null 來表示無,但是在調用 getProducer() 卻又會拋出異常,這樣就不太符合現實邏輯;所以把 null 來用來表示  不合適

在遇到這種情況通常的做法是做null檢查,甚至是每個地方可能發生null指針的做檢查。

  1. public String getPhoneProducerName(Person person) { 
  2.     if (person.getPhone() == null) { 
  3.         return "無名字"
  4.     } 
  5.     if (person.getPhone().getProducer() == null) { 
  6.         return "無名字"
  7.     } 
  8.     return person.getPhone().getProducer().getName(); 

這里我已經試圖在減少代碼的層級,如果使用的是 if-else ,代碼的層級會更深,代碼可讀性下降。

Optional的簡單介紹

吐槽了那么多現狀的不好,現在可以祭出我們的解決方案了 Optional ;千呼萬喚始出來,猶抱琵琶半遮面;那 Optional 到底是個什么東西,我們一起來逐步解開它的面紗。

Optional 本身只是對對象的簡單包裝,如果對象為空,那么會構建一個空的 Optional ;這樣一來 Optional 就包含了存在和不存在兩個情況, 接下來可以看下上面的例子改過之后

  1. public class Person { 
  2.     private Optional<Phone> phone; 
  3.  
  4.     public Optional<Phone> getPhone() { 
  5.         return phone; 
  6.     } 
  7.  
  8. public class Phone { 
  9.     private Producer producer; 
  10.  
  11.     public Producer getProducer() { 
  12.         return producer; 
  13.     } 
  14.  
  15. public class Producer { 
  16.     private String name; 
  17.  
  18.     public String getName() { 
  19.         return name; 
  20.     } 

由于有的人可能沒有手機,有的人有,所以 Phone 需要用 Optional 包裝起來;手機本身一定會有生產的廠商,廠商一定會有一個名字,所以這兩個不需要用 Optional 包裝起來。這里我們會發現使用了 Optional 會豐富代碼的語義,讓代碼更加符合現實。

而當我們在調用 phone.getProducer().getName() 的時候不需要做null指針的檢查,如果說在這里發生了 NullPointerException ,說明這里數據本身是有問題的,不符合現實,就應該讓問題暴露出來,而不是像上面的代碼一樣把問題掩蓋。

Optional的常用方法使用

1. Optional的創建方法

  1. Optional<Person> empty = Optional.empty();  //申明一個空的Optional 
  2. Optional<Person> person = Optional.of(new Person()); //包裝Person 
  3. Optional<Person> person2 = Optional.of(null); //不允許的操作,傳入null 會拋出空指針異常 
  4. Optional<Person> optionalPerson = Optional.ofNullable(null); //允許傳null, 返回一個空的Optional 

2. Optional值的獲取方式

  • map、flatMap 首先我們重新定義一下Phone類,除了有生產廠商之外,還有個型號;
  1. public class Phone { 
  2.     private String model; 
  3.     private Producer producer; 
  4.  
  5.     public Producer getProducer() { 
  6.         return producer; 
  7.     } 
  8.     public String getModel() { 
  9.         return model; 
  10.     } 

當我們需要獲取到手機的型號的時候可以這樣:

  1. Optional<Phone> optionalPhone = Optional.of(new Phone()); 
  2. Optional<String> model = optionalPhone.map(Phone::getModel); 

當我們需要通過Person對象獲取到Phone的型號,會想到這樣:

  1. Optional<Person> optionalPerson = Optional.of(new Person()); 
  2. optionalPerson.map(Person::getPhone).map(Phone::getModel); 

當我們寫出來的時候發現編譯器不能通過。是因為 Person::getPhone 返回的是一個 Optional<Phone> ,調用 optionalPerson.map(Person::getPhone) 返回的就是 Optional<Optional<Phone>> ,所以再 .map 的就無法拿到手機型號,那如何能夠讓返回的結果不是 Optional<Optional<Phone>> ,而是 Optional<Phone> 呢?

這里需要用到另一個方法 flatMap 。 flatMap 和 map 的區別,我在剛開始學習的時候,看到了網上的各種解釋都很繞,看的很暈,最后直接打開源碼來看,發現實現很簡單,很容易理解,來看下源碼:

  1. public<U> Optional<U> map(Function<? super T, ? extends U> mapper) { 
  2.     Objects.requireNonNull(mapper); 
  3.     if (!isPresent()) 
  4.         return empty(); 
  5.     else { 
  6.         return Optional.ofNullable(mapper.apply(value)); 
  7.     } 
  8. public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) { 
  9.     Objects.requireNonNull(mapper); 
  10.     if (!isPresent()) 
  11.         return empty(); 
  12.     else { 
  13.         return Objects.requireNonNull(mapper.apply(value)); 
  14.     } 

map 方法在返回的時候會包裝一層 Optional ; flatMap 在返回的時候直接把函數的返回值返回了,函數的結果必須是 Optional ;那么在前面的例子中我們直接調用 flatMap 返回的結果就是 Optional<Phone>

  1. Optional<Person> optionalPerson = Optional.of(new Person()); 
  2. optionalPerson.flatMap(Person::getPhone).map(Phone::getModel); 
  • 取出 Optional 中的值對象:get、orElse、orElseGet、orElseThrow、ifPresent
  1. get() : 當你明確知道Optional中有值的話可以直接調用該方法,當Optional中沒有值是該方法會拋出異常 NoSuchElementException ;所以當如果存在空值的話建議就不要調用該方法,因為這樣和做null檢查就沒有區別了
  2. orElse(T other) : 提供一個默認值,當值不存在是返回這個默認值

  3. orElseGet(Supplier<? extends T> other) : 當值不存在的時候會調用supper函數,如果說返回這個默認值的邏輯較多,那么調用這個方法比較合適;

  4. orElseThrow(Supplier<? extends X> exceptionSupplier) : 當值為空時會拋出一個自定義的異常

  5. ifPresent(Consumer<? super T> consumer) : 當值不為空是會調用 consumer 函數,如果值為空,那么這個方法什么都不做
  • filter 過濾出滿足條件的對象 假如我們需要過濾出手機型號 IOS 的手機,并打印出型號,代碼如下:
  1. Person person = new Person(Optional.of(new Phone("IOS"))); 
  2.         Optional<Person> optionalPerson = Optional.of(person); 
  3.         optionalPerson.flatMap(Person::getPhone) 
  4.                 .filter(phone -> "IOS".equals(phone.getModel())) 
  5.                 .map(Phone::getModel) 
  6.                 .ifPresent(System.out::println); 
  1. 我們討論了null在Java程序的問題

  2. 介紹Java8中引入了 Optional 來表示有和無的情況以及初始化的方式
  3. 舉例說明了 Optional 中經常使用到的方法

 

責任編輯:張燕妮 來源: 貝塔學JAVA
相關推薦

2009-06-10 22:13:55

JavaScriptExcel打印

2009-10-27 15:49:43

2014-03-25 10:57:42

Android消息推送方案

2009-12-29 09:01:49

2011-07-08 09:44:13

虛擬化網絡解決方案

2014-11-26 09:56:42

企業郵箱移動辦公解決方案

2021-11-03 05:37:22

Windows 11操作系統微軟

2010-04-06 08:48:44

JavaOSCacheJBossCache

2016-05-27 16:03:43

2011-10-27 16:01:54

工作站解決方案

2017-06-01 11:17:57

Python異常重試解決方案

2009-06-16 11:01:14

Java內存溢出

2018-12-03 12:26:30

YADRO解決方案

2018-12-03 11:59:42

Inventec解決方案

2018-12-03 12:13:21

Mellanox解決方案

2018-12-03 12:17:27

Semptian解決方案

2012-05-27 16:21:31

IDC華為

2014-11-24 09:23:22

華為數據中心

2015-05-18 18:15:10

Adobe

2016-09-27 21:14:53

JavaURL
點贊
收藏

51CTO技術棧公眾號

国产大片一区二区三区| 在线天堂一区av电影| 中文字幕第15页| 波多野结衣在线观看一区二区 | 日韩 欧美 自拍| 丰满大乳国产精品| 日韩国产欧美三级| 欧美人交a欧美精品| 国产福利短视频| 精品国产三区在线| 色先锋资源久久综合| 热这里只有精品| 欧美中文在线| 国产精品99久久久久| 欧美在线视频a| 欧美成人精品激情在线视频| 国产调教一区二区三区| 欧美xxxxx牲另类人与| 亚洲爆乳无码专区| 亚洲欧美成人影院| 亚洲国产高清在线观看视频| 国产91视觉| 国产一区二区麻豆| 免费在线亚洲| 久久久久久网址| 永久免费看mv网站入口| 在线日韩一区| 亚洲高清在线观看| 激情久久综合网| 亚洲精品乱码日韩| 色88888久久久久久影院野外| www.国产在线视频| 二区三区在线观看| 中文字幕一区二区视频| 欧美日韩一区二区三| 视频污在线观看| 国产精品影视天天线| 国产精品福利在线| 国产免费a视频| 先锋影音久久久| 91精品国产色综合| 日产亚洲一区二区三区| 欧美日本一区二区视频在线观看| 色偷偷偷亚洲综合网另类| 中文字幕在线观看免费高清| 伊人精品一区| 日韩国产精品亚洲а∨天堂免| 亚洲美女在线播放| 国产精品色呦| 亚洲成人精品av| 无码人妻丰满熟妇啪啪网站| 亚洲精品一二三**| 日韩欧美一区二区免费| 欧美体内she精高潮| 警花av一区二区三区| 欧美一级高清大全免费观看| 午夜影院免费版| 免费精品一区| 欧美成人女星排行榜| 亚洲妇女无套内射精| 视频在线观看免费影院欧美meiju 视频一区中文字幕精品 | 亚洲永久一区二区三区在线| 午夜在线免费观看视频| 国产精品久久久久国产精品日日| 亚洲精品欧美精品| 免费**毛片在线| 亚洲黄色av一区| 欧美国产日韩激情| 在线播放高清视频www| 欧美色xxxx| 亚洲老女人av| 久久99成人| 亚洲国产欧美精品| av网在线播放| 999国产精品永久免费视频app| 日韩有码在线电影| 久久久国产精品人人片| 999亚洲国产精| 国产精品27p| 99riav国产| 91丨porny丨中文| 日韩福利一区二区三区| 99青草视频在线播放视| 亚洲综合一区二区精品导航| 日韩欧美国产综合在线| 色老太综合网| 欧美一区二区视频在线观看| 中国免费黄色片| 韩日一区二区三区| 美女av一区二区| 久久久久女人精品毛片九一| 麻豆成人av在线| 国产自产在线视频一区| 东凛在线观看| 亚洲一区在线播放| 亚洲综合在线网站| 视频在线一区| 中文字幕亚洲欧美日韩高清| 久久精品性爱视频| 日韩—二三区免费观看av| 97se在线视频| 国产尤物视频在线| 亚洲自拍偷拍九九九| 亚洲最大综合网| 欧美电影在线观看完整版| 色噜噜久久综合伊人一本| 日韩欧美大片在线观看| 韩国欧美一区二区| 欧美亚洲精品日韩| 波多一区二区| 9191久久久久久久久久久| 国产精品无码午夜福利| 欧美91视频| 国产精品久久久一区| 色婷婷中文字幕| ●精品国产综合乱码久久久久| 高清在线观看免费| 欧美日本三级| 精品国产一区二区三区在线观看| 欧美性猛交bbbbb精品| 成人午夜视频福利| 亚洲欧美一二三| 日韩福利影视| 在线日韩第一页| 亚洲综合久久网| 99久久精品国产导航| 91精品一区二区三区四区| 国产成人77亚洲精品www| 国产视频精品自拍| 日韩av在线播| 处破女av一区二区| 黄色录像特级片| 亚洲一区导航| 中文一区二区视频| 香蕉污视频在线观看| 91蝌蚪porny成人天涯| 久久成人福利视频| xvideos.蜜桃一区二区| 欧美日韩国产成人在线| 国产成人精品免费看视频| 亚洲色图清纯唯美| 亚洲精品综合在线观看| 91欧美在线| 成人日韩av在线| 日本免费在线视频| 欧美精选在线播放| 麻豆精品国产免费| 麻豆91在线观看| 在线不卡日本| 国产精品igao视频网网址不卡日韩| 日韩最新中文字幕电影免费看| 小泽玛利亚一区二区三区视频| 国产人伦精品一区二区| 亚洲少妇第一页| 久久网站免费观看| 成人免费视频网址| 青春草免费在线视频| 亚洲成人黄色在线| wwwxxx亚洲| 国产色婷婷亚洲99精品小说| 天天爽天天爽夜夜爽| 日韩欧美高清| 亚洲精品女av网站| xxxx视频在线| 亚洲欧美精品一区| 亚洲系列在线观看| 亚洲欧洲中文日韩久久av乱码| 被黑人猛躁10次高潮视频| 尤物在线精品| 日本高清不卡一区二区三| 欧美爱爱视频| 欧美精品在线免费播放| 天堂网在线播放| 色94色欧美sute亚洲13| 国产真实乱在线更新| 成人黄色网址在线观看| 久久久久久久久久久久久国产精品| 日本不卡电影| 99精品国产高清在线观看| 免费看男女www网站入口在线| 亚洲天堂网站在线观看视频| 97视频免费在线| 亚洲一区二区三区四区在线| 一区二区黄色片| 国产一区二区三区久久悠悠色av| 欧美黄色免费网址| 国产欧美高清视频在线| 91九色精品视频| 日本不卡1234视频| 色婷婷久久av| 天天干免费视频| 欧美日韩在线播| 日韩av黄色片| 亚洲欧洲日本在线| 丰满大乳奶做爰ⅹxx视频| 久久激情五月婷婷| 免费看国产一级片| 欧美gayvideo| 鲁丝片一区二区三区| 伊人久久大香伊蕉在人线观看热v| 97人人做人人爱| 黄色网在线播放| 亚洲欧美变态国产另类| 国产91视频在线| 欧美视频在线一区| 可以免费在线观看的av| 亚洲精品第一国产综合野| www亚洲色图| av网站一区二区三区| 欧美精品 - 色网| 日本成人在线不卡视频| 男人添女人下部高潮视频在观看| 91tv官网精品成人亚洲| 日韩一区二区电影在线观看| 美国十次av导航亚洲入口| 91久久久久久久| 欧美free嫩15| 欧美专区在线观看| gratisvideos另类灌满| 欧美老女人性视频| 久做在线视频免费观看| 一本色道久久88综合亚洲精品ⅰ| 欧美日韩国产中文字幕在线| 亚洲第一视频网| 丰满人妻一区二区三区免费| 欧美精品乱人伦久久久久久| 一区二区三区麻豆| 一本到不卡精品视频在线观看| 精品在线免费观看视频| 亚洲免费观看高清| 秋霞欧美一区二区三区视频免费| 国产欧美一区在线| 国产美女免费网站| 久久久国产精品不卡| 成人影视免费观看| 2023国产一二三区日本精品2022| 娇妻高潮浓精白浆xxⅹ| 高清不卡在线观看| 亚洲精品乱码久久久久久9色| 国产又粗又猛又爽又黄91精品| 欧美在线aaa| 毛片一区二区三区| 男人添女人下面免费视频| 日本aⅴ免费视频一区二区三区| 免费大片在线观看| 水野朝阳av一区二区三区| 免费在线观看的av网站| 美女久久一区| 爆乳熟妇一区二区三区霸乳| 日韩经典一区二区| xx欧美撒尿嘘撒尿xx| 麻豆精品一区二区综合av| 尤物国产在线观看| 久久99久久精品欧美| 日本中文字幕二区| 国产成人精品亚洲777人妖| 少妇熟女视频一区二区三区| 高清成人在线观看| 久久人人爽人人人人片| 国产亚洲污的网站| 亚洲精品成人av久久| 国产精品久久久久久久久搜平片 | 韩国一区二区三区美女美女秀| 欧美顶级毛片在线播放| 日本午夜精品电影| 久久国产成人精品| www国产免费| 一本久道久久综合狠狠爱| 国产精品97在线| 麻豆中文一区二区| 2025中文字幕| 久久人人超碰精品| 亚洲综合图片一区| 亚洲一区在线视频| 无码一区二区三区| 欧美一区二区视频网站| 天天操天天插天天射| 宅男66日本亚洲欧美视频| 在线免费观看的av| 日产日韩在线亚洲欧美| 亚洲免费资源| 久久国产精品久久| 日韩综合精品| 少妇av一区二区三区无码| 日韩黄色免费网站| 国产裸体视频网站| 久久久久久久国产精品影院| 一起操在线播放| 欧美性猛交99久久久久99按摩| 国产一区二区在线视频观看| 亚洲国产精品va在线看黑人动漫| 成人午夜影视| 国内精品久久久久| 欧美一级视频免费看| 伊人影院蕉久影院在线播放| 欧美激情第1页| 香蕉成人av| 亚洲最大av在线| 亚州精品视频| 日本丰满大乳奶| 久久久久久色| 国产在线a视频| 国产女人aaa级久久久级| 久久中文字幕在线观看| 在线观看免费一区| 黄色av中文字幕| 日韩专区在线播放| 免费在线小视频| 999久久久| 91一区在线| 欧美综合在线观看视频| 成人福利视频在线看| 国产97免费视频| 欧美日韩高清一区| 国产资源在线看| 欧美一区二区三区……| 成人在线超碰| 天天综合中文字幕| 日韩成人av影视| 欧洲av一区二区三区| 精品久久久久久久久久国产| 精品人妻一区二区三区蜜桃| 日韩在线观看av| 日韩高清在线| 日本一区二区精品| 免费日韩av片| aaaaa一级片| 欧美日韩加勒比精品一区| 亚洲第一天堂影院| 欧美老少配视频| 午夜免费欧美电影| 国内精品国产三级国产99| 九九九久久久精品| 亚洲熟女少妇一区二区| 欧美亚洲综合久久| 超碰国产在线| 国产精品日韩在线一区| 精品美女视频| 91热这里只有精品| 国产日产欧美一区| 波多野结衣家庭主妇| 亚洲性视频网址| 成人影院在线免费观看| 日韩欧美一区二区三区四区| 日韩成人免费电影| 少妇的滋味中文字幕bd| 欧美色成人综合| 青青青青在线| 91丨九色丨国产在线| 午夜久久美女| 极品白嫩的小少妇| 香蕉av福利精品导航| 性感美女视频一二三| 2019精品视频| 国产精品美女久久久久久不卡 | 青青草手机在线观看| 欧美成人bangbros| www.九色在线| 日产精品一线二线三线芒果| 理论电影国产精品| 欧美日韩在线国产| 亚洲第一区在线观看| 国产精品专区免费| 性欧美.com| 国产精品18久久久久| 日本污视频在线观看| 亚洲男人天天操| 久久天堂影院| 国产成人在线小视频| 99re热这里只有精品免费视频| 亚洲性猛交富婆| 久久99热精品| 中文字幕av一区二区三区人| 性猛交ⅹ×××乱大交| 一区二区三区日韩| 青青久草在线| 国产一区玩具在线观看| 亚洲天堂久久| 丁香激情五月少妇| 日韩免费高清视频| 中老年在线免费视频| 中文字幕一区二区三区最新| 暴力调教一区二区三区| 五月天中文字幕| 色综合老司机第九色激情| 欧美猛男同性videos| 超碰在线超碰在线| 欧美视频一区二区三区…| 麻豆网站在线观看| 麻豆av一区二区三区| 国产伦精一区二区三区| 中文字幕亚洲乱码熟女1区2区| 久久精品中文字幕一区| 色天下一区二区三区| 亚洲三级在线视频| 欧美性感一区二区三区| 97蜜桃久久| 美女黄色片网站| 国产亚洲综合在线| 国产成人自拍一区|