91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中Optional如何使用

發布時間:2021-06-12 18:43:38 來源:億速云 閱讀:174 作者:Leah 欄目:編程語言

這期內容當中小編將會給大家帶來有關Java中Optional如何使用,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

Optional

很簡單的一個類,點開它的源代碼,其中所有的方法都是與null相關聯的。

Java中Optional如何使用

這是一個簡化我們處理null的類。

它就是一個容器,其中有我們想要的對象,但是該對象有時候會是空,所以我們需要使用Optional封裝好的方法來獲取需要的對象。從而很好地避免了空指針異常。

Java中Optional如何使用

錯誤示范

我看到網上很多人這么寫:

catRepository.findById(id).get();

下面是Spring Boot 1.5的寫法,那請問:如果上面的寫法是正確的,那為什么還要大費周章設計一個Optional呢?

catRepository.findOne(id);

分析

通過get是能獲取到我們需要的對象。

但是看看get的源代碼,這樣寫,拋出了NoSuchElementException異常,這個異常我們沒法在全局中處理它。

public T get() {
  if (value == null) {
    throw new NoSuchElementException("No value present");
  }
  return value;
}

為什么不能再全局中處理呢?大家可以思考一下:

因為NoSuchElementException覆蓋的范圍太廣了,只要是Optional中有null就會拋出NoSuchElementException,很多情況下都會造成這種異常,那我們究竟要給用戶一個什么樣的提示信息好呢?最后還是給出500服務器異常,那異常處理的意義何在呢?

所以我們需要用Optional來拋出一個有特定范圍的能被全局準確處理的異常。

Cat cat = catRepository.findOne(id);
if (null == cat) {
  throw new EntityNotFoundException("該實體找不到");
}
return cat;

思想都是一樣,我們不過是用一種更簡潔的寫法實現上面的功能。

實現

沒錯,就像下面一樣,我們只需要一行代碼!

public Cat findById(Long id) {
  return catRepository.findById(id).orElseThrow(EntityNotFoundException::new);
}

findById返回一個Optional,然后調用該對象的orElseThrow方法。

Java中Optional如何使用

orElseThrow方法,如果存在,返回包含的值,否則拋出異常。

該方法的參數是一個lamda表達式。這里就不深究lamda表達式的幾種類型了,如果感興趣可以自行研究下FunctionConsumerPredicateSupplier這四個函數式接口的區別。

Java中Optional如何使用

所以傳一個lamda表達式進去,然后IDEA會給出警告:

Java中Optional如何使用

Can be replaced with method reference

lamda表達式能被一個方法引用代替,Alt + Enter,我們最終的代碼就長這樣:

Java中Optional如何使用

這里的::lamda表達式的一種簡寫,是Java8中的新特性,看著可能有點奇怪,原來,編譯器比程序員聰明多了。

異常處理

@RestControllerAdvice
public class GlobalExceptionHandler {

  @ExceptionHandler(EntityNotFoundException.class)
  public ResponseEntity<String> entityNotFoundHandler() {
    return new ResponseEntity<>("您要找的實體不存在", HttpStatus.NOT_FOUND);
  }
}

寫個控制器增強,全局處理異常,這里的RestControllerAdvice又是一個組合注解:

Java中Optional如何使用

處理異常,同時以Json的格式返回。

@Test
public void findById() throws Exception {
  this.mockMvc.perform(get("/cat/1"))
      .andDo(print());
}

寫個控制器的單元測試,查詢一個不存在的實體,運行,看控制臺的打印輸出:

Java中Optional如何使用

一勞永逸

一勞永逸,這是我們最喜歡的東西了。

return catRepository.findById(id).orElseThrow(EntityNotFoundException::new);

以后再查詢,就這一行,再也不用去判斷null了。

NotNull

正所謂條條大路通羅馬,對null的一勞永逸,我們這樣實現,別人也可以那樣實現。

如果你在Spring的項目中打過斷點調試的話,那我斷定你一定見過下面這行代碼:

Assert.notNull();

以下是該方法的源碼,注意這里的Assertorg.springframework.util包下的:

Java中Optional如何使用

剛方法用于判斷null,如果為空,則拋出異常。

隨便點開一個方法,都會在第一行為不該為null的參數進行判斷。

Java中Optional如何使用

這里,不禁對整個框架肅然起敬,同樣一個方法,大牛寫了二十分鐘,而你寫了十分鐘,但是你卻去改了半個小時的bug

@Nullable

可能在上面看到了我們不熟悉的注解@Nullable,表示從來沒見過,這個注解干什么用的呢?

萬能的StackOverflow又給出了完美的回答:

Java中Optional如何使用

這會讓你的代碼更清晰,如果你重寫這個方法,你也需要讓參數可為空。通常也用于代碼提示。

@Nullable@NotNull這一對注解,沒什么實際意義,只是用于代碼更清晰,同時編譯器能給出我們提示。

總結

之前一直抱怨Java更新的太快,學校教的是Java5之前的東西,從Java5開始有的注解,但是從來沒講過這個東西,然而去看看官方的描述:

Java中Optional如何使用

其實,Java的每次更新,都是為了我們更簡潔優雅的代碼而努力。去看看官方的描述,Java讓我們將更多的精力放在think上,而不是code上。

上述就是小編為大家分享的Java中Optional如何使用了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

黄陵县| 丘北县| 扶沟县| 黎平县| 塔城市| 临高县| 金阳县| 海晏县| 漯河市| 临海市| 达日县| 合肥市| 同德县| 黄浦区| 泗阳县| 周至县| 鄂托克旗| 通海县| 吕梁市| 壤塘县| 麟游县| 旅游| 无为县| 犍为县| 新邵县| 东源县| 罗源县| 洛宁县| 诸城市| 上犹县| 土默特左旗| 岳普湖县| 凌云县| 当涂县| 大埔区| 东平县| 扶余县| 开化县| 南投市| 莱芜市| 花莲市|