最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java關(guān)于JDK1.8中的Optional類

 更新時(shí)間:2021年09月03日 14:13:20   作者:碼農(nóng)飛哥  
本文主要介紹了Optional類的一些常用方法,以及其應(yīng)用場(chǎng)景,其主要是為了規(guī)避空指針異常(NPE)。熟練的運(yùn)用Optional類可以很大的簡(jiǎn)化我們的代碼,使代碼簡(jiǎn)潔明了。,需要的朋友可以參考下面文章內(nèi)容

Java關(guān)于JDK1.8中的Optional類

一、定義

Optional是一個(gè)容器,它可以保存類型T的值,或者僅僅保存null,Optional類主要是用來(lái)避免空指針異常(NPE),其提供的一系列的方法配合Lambda表達(dá)式可以讓代碼更加清晰,語(yǔ)義化,以及避免了空指針異常的問(wèn)題,這里要注意是避免空指針異常,而不是避免返回null。

二、Optional方法的使用

1、empty 方法

empty 方法返回一個(gè)不包含值的Optional實(shí)例,注意不保證返回的empty是單例,不要用==比較。

public static<T> Optional<T> empty()

2、of 方法返

of 方法返回一個(gè)Optional實(shí)例,傳入的值必須是非空值,傳入null會(huì)拋出空指針異常。

public static <T> Optional<T> of(T value)

3、返回一個(gè)Optional實(shí)例

如果傳入值非空,則實(shí)例中包含非空值,如果傳入null,返回不包含值的empty

public static <T> Optional<T> ofNullable(T value)

4、isPresent 方法

用來(lái)判斷實(shí)例是否包含值,如果不包含非空值返回false,否則返回true

public boolean isPresent();

5、get方法

如果實(shí)例包含值則返回當(dāng)前值,否則拋出NoSushElementException 異常.

public T get();

不推薦調(diào)用上面兩個(gè)方法,因?yàn)槿菀讓懗鋈缦麓a,比原先判斷if null的代碼還要臟

   public static String getUserName1(User user) {
        Optional<User> user1 = Optional.ofNullable(user);
        if (!user1.isPresent()) {
            return "參數(shù)為空";
        }
        return user1.get().getName();
    }

下面是用if-null

  public static String getUserName(User user) {
        if (user == null) {
            return "參數(shù)為空";
        }
        return user.getName();
    }

6、ifPresent

(Consumer consumer):如果option對(duì)象保存的值不是null,則調(diào)用consumer對(duì)象,否則不調(diào)用

 public void ifPresent(Consumer<? super T> consumer);

代碼示例:

   Optional<Integer> optional1 = Optional.ofNullable(1);
        Optional<Object> optional2 = Optional.ofNullable(null);
     //如果不是null,調(diào)用Consumer
        optional1.ifPresent(t -> System.out.println("value is" + t));   //value is1
        //如果是null,不調(diào)用Consumer
        optional2.ifPresent(t -> System.out.println("value is " + t));   

如上代碼,輸出結(jié)果是 第一條 語(yǔ)句輸出value is1,第二條語(yǔ)句沒有輸出

 7、filter方法

 如果值存在,并且這個(gè)值匹配給定的predicate,返回一個(gè)Optional用以描述這個(gè)值,否則返回一個(gè)空的Optional

Optional<T> filter(Predicate<? super <T> predicate)

代碼示例:

  Optional<Integer> optional1 = Optional.ofNullable(1);
       Optional<Object> optional2 = Optional.ofNullable(null);
       Optional<Integer> filter1 = optional1.filter(a -> a == null);
        Optional<Integer> filter2 = optional1.filter((a) -> a == 1);
        Optional<Object> filter3 = optional2.filter(a -> a == null);
  
    System.out.println(filter1.isPresent()); //false
        System.out.println(filter2.isPresent()); //true
        System.out.println(filter2.get().intValue() == 1); //true

如上代碼,演示了filter方法如何使用,輸出結(jié)果如代碼注釋所示。

8、 map(Function)

對(duì)Optional中保存的值進(jìn)行函數(shù)運(yùn)算,并返回新的Optional(可以是任何類型)

 public<U> Optional<U> map(Function<? super T, ? extends U> mapper);

代碼示例:輸出結(jié)果已經(jīng)寫在注釋中。

  Optional<Integer> optional1 = Optional.ofNullable(1);
        Optional<Object> optional2 = Optional.ofNullable(null);
  Optional<String> str1Optional = optional1.map(a -> "key" + a);
        Optional<String> str2Optional = optional2.map(a -> "key" + a);
        System.out.println(str1Optional.get()); //key1
        System.out.println(str2Optional.isPresent()); //false

9、flatMap()

功能與map()相似,差別在返回值不同,flatMap方法的mapping函數(shù)返回值可以是任何類型T,而map方法的mapping函數(shù)必須是Optional

 public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper);

代碼示例:

  Optional<Integer> optional1 = Optional.ofNullable(1);
        Optional<Object> optional2 = Optional.ofNullable(null);
       Optional<Optional<String>> str11Optional = optional1.map(a -> Optional.of("key" + a));
        Optional<String> str22Optional = optional1.flatMap(a -> Optional.of("key" + a));
        System.out.println(str11Optional.get().get()); //key1
        System.out.println(str22Optional.get()); //key1

10、orElse方法

如果optional對(duì)象保存的值不是null,則返回原來(lái)的值,否則返回value。

public T orElse(T other);

代碼示例:

        Optional<Integer> optional1 = Optional.ofNullable(1);
        Optional<Object> optional2 = Optional.ofNullable(null);
    System.out.println(optional1.orElse(1000) == 1); //true
        System.out.println((Integer) optional2.orElse(1000) == 1000);//true

11、orElseGet(Supplier supplier)

功能與orElse一樣,只不過(guò)orElseGet參數(shù)是一個(gè)對(duì)象。
 

public T orElseGet(Supplier<? extends T> other);

代碼示例:

       Optional<Integer> optional1 = Optional.ofNullable(1);
        Optional<Object> optional2 = Optional.ofNullable(null);
   System.out.println(optional1.orElseGet(() -> 1000) == 1); //true
        System.out.println((Integer) optional2.orElseGet(() -> 1000) == 1000); //true

12、orElseThrow方法

值不存在則調(diào)用傳入的Supplier參數(shù),生成一個(gè)異常實(shí)例并拋出,這個(gè)方法通常與全局異常處理器一起使用,當(dāng)參數(shù)或者其他情況獲取不到值是,拋出自定義異常,由異常處理器處理成通用返回結(jié)果。

public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier);

代碼示例:

       optional1.orElseThrow(() -> {
            throw new IllegalStateException();
        });
        try {
            optional2.orElseThrow(() -> {
                throw new IllegalStateException();
            });
        } catch (IllegalStateException e) {
            e.printStackTrace();
        }

三、實(shí)戰(zhàn)參考

假設(shè)我們要解析一段json字符串,按照傳統(tǒng)的if-null方式我們需要做如下處理:為了獲取CUid的值,我們必須要判斷三次。

 public static String getOrgUid(String orgResult) {
        if (StringUtils.isBlank(orgResult)) {
            return null;
        }
        JSONObject jsonObject = JSON.parseObject(orgResult);
        if (jsonObject == null) {
            return null;
        }
        if ("success".equals(jsonObject.getString("result"))) {
            return jsonObject.getString("CUid");
        }
        return null;
    }

而運(yùn)用了我們的Optional類之后,我們可以通過(guò)函數(shù)式變成來(lái)實(shí)現(xiàn)。

 public static String getNewUid(String orgResult) {
        String orElse = Optional.ofNullable(orgResult)
                .map(n -> JSONObject.parseObject(n))
                .map(a -> {
                    if ("success".equals(a.getString("result"))) {
                        return a.getString("CUid");
                    }
                    return null;
                }).orElse(null);
        return orElse;
    }

運(yùn)用了函數(shù)式變成,我們只需要三段3段代碼就能輕松的駕馭,代碼簡(jiǎn)潔明了。

到此這篇關(guān)于Java關(guān)于JDK1.8中的Optional類的文章就介紹到這了,更多相關(guān)Java的Optional類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MyBatis?如何使項(xiàng)目兼容多種數(shù)據(jù)庫(kù)的解決方案

    MyBatis?如何使項(xiàng)目兼容多種數(shù)據(jù)庫(kù)的解決方案

    要想做兼容多種數(shù)據(jù)庫(kù),那毫無(wú)疑問(wèn),我們首先得明確我們要兼容哪些數(shù)據(jù)庫(kù),他們的數(shù)據(jù)庫(kù)產(chǎn)品名稱是什么,本次我們講解了一套使項(xiàng)目兼容多種數(shù)據(jù)庫(kù)的方案,對(duì)MyBatis項(xiàng)目兼容多種數(shù)據(jù)庫(kù)操作方法感興趣的朋友一起看看吧
    2024-05-05
  • Java中的模板模式說(shuō)明與實(shí)現(xiàn)

    Java中的模板模式說(shuō)明與實(shí)現(xiàn)

    這篇文章主要介紹了Java中的模板模式說(shuō)明與實(shí)現(xiàn),模板方法模式,又叫模板模式,在一個(gè)抽象類公開定義了執(zhí)行它的方法的模板,它的子類可以更需要重寫方法實(shí)現(xiàn),但可以成為典型類中定義的方式進(jìn)行,需要的朋友可以參考下
    2023-10-10
  • 詳解Kotlin的空指針處理

    詳解Kotlin的空指針處理

    這篇文章主要介紹了詳解Kotlin的空指針處理的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • 淺談mac下maven的安裝配置與使用

    淺談mac下maven的安裝配置與使用

    這篇文章主要介紹了淺談mac下maven的安裝配置與使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Java讀寫.properties文件解決中文亂碼問(wèn)題

    Java讀寫.properties文件解決中文亂碼問(wèn)題

    這篇文章主要介紹了Java讀寫.properties文件解決中文亂碼問(wèn)題,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-11-11
  • Spring使用@Autowired注解實(shí)現(xiàn)自動(dòng)裝配方式

    Spring使用@Autowired注解實(shí)現(xiàn)自動(dòng)裝配方式

    這篇文章主要介紹了Spring使用@Autowired注解實(shí)現(xiàn)自動(dòng)裝配方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • springboot config 攔截器使用方法實(shí)例詳解

    springboot config 攔截器使用方法實(shí)例詳解

    本文介紹Spring-Boot中使用攔截器的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2018-05-05
  • Spring Bean屬性注入的兩種方式詳解

    Spring Bean屬性注入的兩種方式詳解

    Spring 屬性注入(DI依賴注入)有兩種方式:setter注入,構(gòu)造器注入。本文將詳細(xì)為大家介紹一下這兩種方式的具體用法,感興趣的可以了解一下
    2022-06-06
  • Java8中Optional類的使用說(shuō)明

    Java8中Optional類的使用說(shuō)明

    Optional類主要解決的問(wèn)題是臭名昭著的空指針異常(NullPointerException),每個(gè)Java程序員都非常了解的異常,這篇文章主要給大家介紹了關(guān)于Java8中Optional類使用的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • Java 獲取本機(jī)的IP與MAC地址實(shí)現(xiàn)詳解

    Java 獲取本機(jī)的IP與MAC地址實(shí)現(xiàn)詳解

    這篇文章主要介紹了Java 獲取本機(jī)的IP與MAC地址實(shí)現(xiàn)詳解的相關(guān)資料,需要的朋友可以參考下
    2016-09-09

最新評(píng)論

洪洞县| 海口市| 阿勒泰市| 丘北县| 宁夏| 大港区| 彩票| 寻甸| 韩城市| 陇川县| 江孜县| 赫章县| 阳谷县| 桐乡市| 静安区| 太湖县| 连山| 灵川县| 义乌市| 读书| 昌宁县| 岳西县| 南华县| 盘锦市| 德江县| 陈巴尔虎旗| 无极县| 双牌县| 石楼县| 公安县| 临泽县| 库车县| 垦利县| 昭通市| 大港区| 崇明县| 广丰县| 会理县| 青海省| 郯城县| 通山县|