成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JDK8 的判空就是這么爽!

開發 后端
大家都是知道 JDK8 就開始使用 Lambda 表達式,但是很多不管是在教程上還是在其他的書籍上,都沒有說在實際開發的時候去使用上這個 Lambda 表達式,而且包括 JDK8 里面的一些新的類,也都沒有引入,所以阿粉在這里想要給大家安利一波使用方面的知識。

[[415977]]

阿粉相信大家肯定所有的開發者都對Java8里面的所有的東西都感興趣,雖然目前的 JDK 已經更新到 JDK17 了,但是阿粉相信,現在很多公司使用的還都是 JDK8 甚至是 JDK7,但是,就算是有些公司已經升級到 JDK8 但是對于 JDK8 里面的一些東西的使用,卻沒有使用的淋漓盡致。阿粉今天就給大家放出幾個 JDK8 里面比較好用的。

JDK8

大家都是知道 JDK8 就開始使用 Lambda 表達式,但是很多不管是在教程上還是在其他的書籍上,都沒有說在實際開發的時候去使用上這個 Lambda 表達式,而且包括 JDK8 里面的一些新的類,也都沒有引入,所以阿粉在這里想要給大家安利一波使用方面的知識。

Optional類

這個類對于大家來說,是一個非常重要的類,不知道大家有沒有被 java.lang.NullPointerException 瘋狂的折磨過,不管是新人開發還是老開發,遇到這個問題的時候,都是頭大的很,因為我們要在代碼里面去瘋狂的判斷是否是null,如果不是 null 需要怎么處理,如果是 null 需要怎么處理,反正就是你要是想解決 java.lang.NullPointerException 這個問題,就免不了去加一些判斷條件,而 Optional 這個類,則是幫你優雅的處理 null 的問題。

我們先看一組 Java7 中的一些判斷空的實現:

  1. User user = usersMapper.selectUserById(userId); 
  2. String userName = user.getUserName(); 
  3.    if(user!= null){ 
  4.        if(userName != null && !userName.isEmpty()){ 
  5.                ..... 
  6.              } 
  7.    } 
  8.   

阿粉相信大家一定都寫過這個樣子的代碼,因為我們不知道SQL查詢出來的數據中是否包含了我們的 Users 對象,如果要是 Users 對象,那么就會無情的出現 java.lang.NullPointerException 這個空指針異常,這時候就很尷尬了,老開發一臉懵逼,我竟然還有的地方沒有驗證?

但是驗證了之后,你就會發現代碼量是非常的大,而且有點不太美觀,我們再來對比一下 JDK8 中,給我們提供的方法來進行驗證的方式。

  1. User user = usersMapper.selectUserById(userId); 
  2. Optional.ofNullable(user
  3.         .map(User::getUserName) 
  4.         .ifPresent(userName->{ 
  5.         .... 
  6.         } 

大家看這種鏈式編程,ofNullable() 方法給我們提供了判斷 user 是不是空,并且去校驗 userName,如果存在,然后執行下面的邏輯,相比較 JDK7 的內容,相信大家看起來的話肯定是沒有 JDK7 中的表現的那么的明顯,但是大家看代碼是不是發現已經被處理的妥妥的了。而且非常的優雅。

相信大家肯定都看過一些教程,上面會寫到:

  1. User user = usersMapper.selectUserById(userId); 
  2. Optional<User> userOptional = Optional.ofNullable(user); 
  3. Optional<String> str = userOptional.map(User::getUserName); 
  4. .... 

但是相對于代碼的可讀性來說,我們肯定還是希望使用 JDK7 上面的判斷來進行判斷,但是這種 JDK8 的鏈式編程,在一定程度上減少了代碼量,并且開發效率也會相對應的提升。

如果大家不信,我們可以來運行一下我們的代碼,然后看一下效果。

  1. Optional.ofNullable(user
  2.         .map(User::getUserName) 
  3.         .ifPresent(userName->{ 
  4.             System.out.println("用戶UserName不為空"); 
  5.         }); 

大家看,是不是就出現了我們想要的結果,一個判斷 null 的操作,瞬間變得高大上了,而且代碼的逼格瞬間上升一個檔次。

對于 Optional 類,在 Java8 實戰中給出了很多的方法,阿粉也是給大家摘取了一下,做了個總結,

  • ofNullable 方法 :將指定值用Optional封裝之后返回,如果該值為null,則返回一個空的Optional對象
  • empty 方法 :返回一個空的Optional實例
  • filter 方法 :如果值存在并且滿足提供的謂詞,就返回包含該值的Optional對象;否則返回一個空的 Optional對象
  • flatMap 方法 :如果值存在,就對該值執行提供的mapping函數調用,返回一個Optional類型的值,否則就返 回一個空的Optional對象
  • get 方法 :如果該值存在,將該值用Optional封裝返回,否則拋出一個NoSuchElementException異常
  • ifPresent 方法 :如果值存在,就執行使用該值的方法調用,否則什么也不做
  • isPresent 方法 :如果值存在就返回true,否則返回false
  • map 方法 :如果值存在,就對該值執行提供的mapping函數調用
  • of 方法 :將指定值用Optional封裝之后返回,如果該值為null,則拋出一個NullPointerException異常
  • orElse 方法:如果有值則將其返回,否則返回一個默認值
  • orElseGet 方法 :如果有值則將其返回,否則返回一個由指定的Supplier接口生成的值
  • orElseThrow 方法 :如果有值則將其返回,否則拋出一個由指定的Supplier接口生成的異常

大家看這些方法是不是都有很多相似的,比如 map,flatMap,還有orElse,orElseGet,orElseThrow 方法

map 和 flatMap 比較:

這兩個都是做 轉換值 的操作,區別就是入參的類型不是一樣的,map的入參是 Function mapper 而 flatMap 入參則是 Function > mapper 。

入參的不同也就導致了他們獲取返回值也是不同的,map中獲取的返回值自動被Optional包裝,flatMap中返回值保持不變,但必須是Optional類型。

這么一看總是感覺不太對的樣子,我們去源碼里面看看是什么樣子的。

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

map 方法參數中的函數 mapper 輸出的是值,然后 map 方法會使用 Optional.ofNullable 將其包裝為 Optional;而 flatMap 要求參數中的函數 mapper 輸出的就是 Optional。

一個是比較聰明的,另外一個就相對來說不是那么聰明了,人家會自己包裝呀,是不是?

同樣的比較還有 orElse,orElseGet,orElseThrow 但是這個阿粉就不再給大家絮叨了,因為上面的方法解釋上都很明顯的能看到了。

Lambda 表達式

Lambda 表達式實際上就是相當于是一個匿名內部類,他就是讓我們開發的人把函數當成參數傳遞給某個方法,然后把代碼當做數據去處理。

阿粉相信大家肯定都了解這塊,就比如說下面的代碼對比:

  1. Java7: 
  2.  
  3.     List<String> stringList = Arrays.asList("1""2""3"); 
  4.         for (String st:stringList) { 
  5.             System.out.println(st); 
  6.         } 
  7.  
  8. Java8: 
  9.  
  10. Arrays.asList("1""2""3").forEach((String st)->{ 
  11.             System.out.println(st); 
  12.         }); 

同樣的一個循環,我們肯定想用第二種寫法不是么?

Java8 實際上在從發布開始,很多公司都在用,但是也有很多人依舊選擇是 Java7,因為不想改變自己的學習風格,阿粉相信大家如果是一個決心在開發領域一直做下去的人,那么肯定會保持一個不斷學習的心,所以,你是這樣的人么?

 

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2022-03-30 07:32:10

JDK8異步編程

2022-05-31 07:32:19

JDK8API工具

2022-04-21 09:48:54

JDK8JDK7編碼

2022-04-21 07:34:34

JDK8JDK7數據

2021-02-26 10:21:35

比特幣投資金融

2021-01-15 10:03:18

JDK8日期API

2022-04-18 09:54:37

JDK8日期前端

2015-09-10 14:40:32

大數據神奇

2017-02-24 13:20:13

搜索引擎數據結構架構

2024-04-08 07:27:02

JDK8ZGC垃圾回收

2014-07-03 13:51:10

Android LAndroid L源碼

2017-03-09 10:45:31

定義內存泄漏

2018-12-17 09:46:32

OracleJDK8

2017-11-28 15:29:04

iPhone X網頁適配

2021-05-24 10:50:10

Git命令Linux

2014-12-09 13:06:30

華為移動公交

2021-08-19 06:58:48

CSS頁面布局

2021-12-28 16:54:03

2010-05-11 19:13:12

Unix系統

2020-06-16 10:57:20

搭建
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩欧美在线观看视频网站 | 一区二区精品 | 视频羞羞| 伊人网站视频 | 亚洲国产成人在线观看 | 欧美一级久久 | 日韩欧美大片在线观看 | 欧洲av一区 | 亚洲视频在线免费观看 | 欧美成视频在线观看 | 亚洲免费一区二区 | 久久亚洲一区 | 久久亚洲一区二区三 | 国产精品观看 | 日韩1区2区 | 国产乱码精品一区二区三区中文 | 人人草人人干 | 91高清视频在线 | 91久久国产 | 成人免费网站www网站高清 | 久久久妇女国产精品影视 | 日韩在线一区二区 | 99资源 | 日韩成人av在线 | 免费视频一区二区三区在线观看 | 欧美日韩一区二区视频在线观看 | 伊人免费在线观看高清 | 中文字幕国产第一页 | 日日夜夜精品视频 | 日韩成人在线免费观看 | 犬夜叉在线观看 | 久草热在线 | 亚洲一区二区精品视频 | 中文字幕日韩欧美一区二区三区 | 国产一区二区欧美 | 一级黄在线观看 | 欧美综合国产精品久久丁香 | 九九在线视频 | 一区二区三区免费 | 瑟瑟视频在线看 | av一区二区三区四区 |