亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java Optional實(shí)踐(小結(jié))

 更新時(shí)間:2018年09月25日 09:04:43   作者:張喜碩  
這篇文章主要介紹了Java Optional實(shí)踐(小結(jié)),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

問題描述

在大熱的Spring Boot 2.0中,在將原來的泛型改為了Optional,旨在讓我們的代碼更簡(jiǎn)潔。

實(shí)踐

Optional

很簡(jiǎn)單的一個(gè)類,點(diǎn)開它的源代碼,其中所有的方法都是與null相關(guān)聯(lián)的。

這是一個(gè)簡(jiǎn)化我們處理null的類。

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

錯(cuò)誤示范

我看到網(wǎng)上很多人這么寫:

catRepository.findById(id).get();

下面是Spring Boot 1.5的寫法,那請(qǐng)問:如果上面的寫法是正確的,那為什么還要大費(fèi)周章設(shè)計(jì)一個(gè)Optional呢?

catRepository.findOne(id);

分析

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

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

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

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

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

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

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

思想都是一樣,我們不過是用一種更簡(jiǎn)潔的寫法實(shí)現(xiàn)上面的功能。

實(shí)現(xiàn)

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

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

findById返回一個(gè)Optional,然后調(diào)用該對(duì)象的orElseThrow方法。

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

該方法的參數(shù)是一個(gè)lamda表達(dá)式。這里就不深究lamda表達(dá)式的幾種類型了,如果感興趣可以自行研究下Function、ConsumerPredicate、Supplier這四個(gè)函數(shù)式接口的區(qū)別。

所以傳一個(gè)lamda表達(dá)式進(jìn)去,然后IDEA會(huì)給出警告:

Can be replaced with method reference

lamda表達(dá)式能被一個(gè)方法引用代替,Alt + Enter,我們最終的代碼就長(zhǎng)這樣:

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

異常處理

@RestControllerAdvice
public class GlobalExceptionHandler {

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

寫個(gè)控制器增強(qiáng),全局處理異常,這里的RestControllerAdvice又是一個(gè)組合注解:

處理異常,同時(shí)以Json的格式返回。

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

寫個(gè)控制器的單元測(cè)試,查詢一個(gè)不存在的實(shí)體,運(yùn)行,看控制臺(tái)的打印輸出:

一勞永逸

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

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

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

NotNull

正所謂條條大路通羅馬,對(duì)null的一勞永逸,我們這樣實(shí)現(xiàn),別人也可以那樣實(shí)現(xiàn)。

如果你在Spring的項(xiàng)目中打過斷點(diǎn)調(diào)試的話,那我斷定你一定見過下面這行代碼:

Assert.notNull();

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

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

隨便點(diǎn)開一個(gè)方法,都會(huì)在第一行為不該為null的參數(shù)進(jìn)行判斷。

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

@Nullable

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

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

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

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

總結(jié)

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

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java使用Tess4J實(shí)現(xiàn)圖像識(shí)別方式

    Java使用Tess4J實(shí)現(xiàn)圖像識(shí)別方式

    這篇文章主要介紹了Java使用Tess4J實(shí)現(xiàn)圖像識(shí)別方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 如何在springMVC的controller中獲取request

    如何在springMVC的controller中獲取request

    這篇文章主要介紹了如何在springMVC的controller中獲取request,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Java?超詳細(xì)講解十大排序算法面試無憂

    Java?超詳細(xì)講解十大排序算法面試無憂

    這篇文章主要介紹了Java常用的排序算法及代碼實(shí)現(xiàn),在Java開發(fā)中,對(duì)排序的應(yīng)用需要熟練的掌握,這樣才能夠確保Java學(xué)習(xí)時(shí)候能夠有扎實(shí)的基礎(chǔ)能力。那Java有哪些排序算法呢?本文小編就來詳細(xì)說說Java常見的排序算法,需要的朋友可以參考一下
    2022-04-04
  • Java中FileOutputStream流的write方法

    Java中FileOutputStream流的write方法

    這篇文章主要為大家詳細(xì)介紹了Java中FileOutputStream流的write方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • drools中then部分的寫法(推薦)

    drools中then部分的寫法(推薦)

    本文介紹一下drools中then部分的寫法,以及一些內(nèi)置的方法,比如insert/delete/modify等等。同時(shí)也介紹一下rule的繼承,和在when中實(shí)現(xiàn)if else if?等操作,感興趣的朋友跟隨小編一起看看吧
    2022-05-05
  • Java中的Optional使用詳細(xì)說明

    Java中的Optional使用詳細(xì)說明

    這篇文章主要介紹了Java中的Optional使用詳細(xì)說明,Optional就是相當(dāng)于把對(duì)象包了一層,將判斷空的部分代碼給單獨(dú)抽出來了,主要就是為了避免null引起的部分問題,需要的朋友可以參考下
    2023-11-11
  • SpringMVC的組件之HandlerExceptionResolver詳解

    SpringMVC的組件之HandlerExceptionResolver詳解

    這篇文章主要介紹了SpringMVC的組件之HandlerExceptionResolver詳解,不管是在處理請(qǐng)求映射(HandlerMapping),還是在請(qǐng)求被處理(Handler)時(shí)拋出的異常,DispatcherServlet都會(huì)委托給HandlerExceptionResolver進(jìn)行異常處理,該接口只有一個(gè)方法,需要的朋友可以參考下
    2023-10-10
  • SpringBoot 啟動(dòng)報(bào)錯(cuò)Unable to connect to Redis server: 127.0.0.1/127.0.0.1:6379問題的解決方案

    SpringBoot 啟動(dòng)報(bào)錯(cuò)Unable to connect to 

    這篇文章主要介紹了SpringBoot 啟動(dòng)報(bào)錯(cuò)Unable to connect to Redis server: 127.0.0.1/127.0.0.1:6379問題的解決方案,文中通過圖文結(jié)合的方式給大家講解的非常詳細(xì),對(duì)大家解決問題有一定的幫助,需要的朋友可以參考下
    2024-10-10
  • 深入淺出的講解Java關(guān)鍵字final的作用

    深入淺出的講解Java關(guān)鍵字final的作用

    final是Java中非常常見的一個(gè)關(guān)鍵字,可以說每天都在使用它,雖然常見,但卻也不見得都那么顯而易見,今天就來研究一下final,以加深對(duì)它的理解和更合理的運(yùn)用,需要的朋友可以參考下
    2023-06-06
  • 使用FeignClient調(diào)用遠(yuǎn)程服務(wù)時(shí)整合本地的實(shí)現(xiàn)方法

    使用FeignClient調(diào)用遠(yuǎn)程服務(wù)時(shí)整合本地的實(shí)現(xiàn)方法

    這篇文章主要介紹了使用FeignClient調(diào)用遠(yuǎn)程服務(wù)時(shí)整合本地的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03

最新評(píng)論