成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java Optional 實(shí)踐

jaysun / 3436人閱讀

摘要:實(shí)踐很簡(jiǎn)單的一個(gè)類,點(diǎn)開(kāi)它的源代碼,其中所有的方法都是與相關(guān)聯(lián)的。從而很好地避免了空指針異常。方法,如果存在,返回包含的值,否則拋出異常。隨便點(diǎn)開(kāi)一個(gè)方法,都會(huì)在第一行為不該為的參數(shù)進(jìn)行判斷。

問(wèn)題描述

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

實(shí)踐 Optional

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

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

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

錯(cuò)誤示范

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

catRepository.findById(id).get();

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

catRepository.findOne(id);
分析

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

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

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

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

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

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

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

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

實(shí)現(xiàn)

沒(méi)錯(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、Consumer、Predicate、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)奇怪,原來(lái),編譯器比程序員聰明多了。

異常處理
@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(EntityNotFoundException.class)
    public ResponseEntity 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)目中打過(guò)斷點(diǎn)調(diào)試的話,那我斷定你一定見(jiàn)過(guò)下面這行代碼:

Assert.notNull();

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

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

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

這里,不禁對(duì)整個(gè)框架肅然起敬。

總結(jié)

之前一直抱怨Java更新的太快:

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

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/77239.html

相關(guān)文章

  • Java 8th 函數(shù)式編程:Optional 類型

    摘要:當(dāng)滿足條件時(shí)執(zhí)行傳入的參數(shù)化操作。最后提醒一點(diǎn),好用但不能濫用,在設(shè)計(jì)一個(gè)接口方法時(shí)是否采取類型返回需要斟酌,一味的使用會(huì)讓代碼變得比較啰嗦,反而破壞了代碼的簡(jiǎn)潔性。鑒于作者水平有限,文中不免有錯(cuò)誤之處,歡迎批評(píng)指正個(gè)人博客 NullPointException 可以說(shuō)是所有 java 程序員都遇到過(guò)的一個(gè)異常,雖然 java 從設(shè)計(jì)之初就力圖讓程序員脫離指針的苦海,但是指針確實(shí)是實(shí)際...

    RayKr 評(píng)論0 收藏0
  • Java8新特性總覽

    摘要:新特性總覽標(biāo)簽本文主要介紹的新特性,包括表達(dá)式方法引用流默認(rèn)方法組合式異步編程新的時(shí)間,等等各個(gè)方面。還有對(duì)應(yīng)的和類型的函數(shù)連接字符串廣義的歸約匯總起始值,映射方法,二元結(jié)合二元結(jié)合。使用并行流時(shí)要注意避免共享可變狀態(tài)。 Java8新特性總覽 標(biāo)簽: java [TOC] 本文主要介紹 Java 8 的新特性,包括 Lambda 表達(dá)式、方法引用、流(Stream API)、默認(rèn)方...

    mayaohua 評(píng)論0 收藏0
  • Java8實(shí)戰(zhàn)》-第十章筆記(用Optional取代null)

    摘要:是第一批在堆上分配記錄的類型語(yǔ)言之一。實(shí)際上,的這段話低估了過(guò)去五十年來(lái)數(shù)百萬(wàn)程序員為修復(fù)空引用所耗費(fèi)的代價(jià)。很明顯,這種方式不具備擴(kuò)展性,同時(shí)還犧牲了代碼的可讀性。是目前程序開(kāi)發(fā)中最典型的異常。完成這一任務(wù)有多種方法。 用Optional取代null 如果你作為Java程序員曾經(jīng)遭遇過(guò)NullPointerException,請(qǐng)舉起手。如果這是你最常遭遇的異常,請(qǐng)繼續(xù)舉手。非??上?,...

    flybywind 評(píng)論0 收藏0
  • [譯] Java 中最常見(jiàn)的 5 個(gè)錯(cuò)誤

    摘要:近日,在上列舉了開(kāi)發(fā)中常見(jiàn)的個(gè)錯(cuò)誤,與君共免。在多線程中并發(fā)修改集合內(nèi)容是非常常見(jiàn)的,因此需要使用并發(fā)編程中常用的方法進(jìn)行處理,例如同步鎖對(duì)于并發(fā)修改采用特殊的集合等等。在單線程和多線程情況下解決這個(gè)問(wèn)題有微小的差別。 在編程時(shí),開(kāi)發(fā)者經(jīng)常會(huì)遭遇各式各樣莫名錯(cuò)誤。近日,Sushil Das 在 Geek On Java上列舉了 Java 開(kāi)發(fā)中常見(jiàn)的 5 個(gè)錯(cuò)誤,與君共「免」。 原文...

    chemzqm 評(píng)論0 收藏0
  • Java Optional API

    摘要:于是,在引入了,用來(lái)代表一種可能有可能沒(méi)有的數(shù)據(jù),可以用來(lái)緩解空指針異常的問(wèn)題。 一位智者說(shuō)過(guò),沒(méi)有處理過(guò)空指針異常就不算一個(gè)真正的 Java 程序員。這當(dāng)然是開(kāi)玩笑,但是空指針異常確實(shí)是很多程序出錯(cuò)的源頭。于是,在 Java 8 引入了 java.util.Optional,Optional 用來(lái)代表一種 可能有可能沒(méi)有 的數(shù)據(jù),可以用來(lái)緩解空指針異常的問(wèn)題。 簡(jiǎn)單地說(shuō),Option...

    YorkChen 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<