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

Java中的Optional類用法詳細(xì)講解

 更新時間:2024年10月28日 10:43:26   作者:所望  
這篇文章詳細(xì)介紹了Java中Optional類的使用,包括創(chuàng)建Optional對象,Optional對象的常用方法,如get、orElse、orElseGet、orElseThrow等,以及Optional類結(jié)合Lambda表達(dá)式和StreamAPI的使用,需要的朋友可以參考下

前言

java中嘗試訪問空引用的屬性調(diào)用空引用的方法是會報空指針NullPointerException異常。實際項目中會處理大量為空的值,代碼會有很多的條件判斷,難以閱讀與維護(hù)。

        if(user!=null){
            System.out.println(user.getFullName());
        }else {
            User defaultUser = new User("Stark", "Tony Stark");
            System.out.println(defaultUser.getFullName());
        }

一、Optional是什么?

Optional類引入了一種顯式的方式來處理可能為空的對象,強(qiáng)制程序員在可能為空的情況下進(jìn)行顯式的處理,以避免空指針異常。

Optional類似容器,可以包含各種類型的值,也可以為null。Optional類提供了一系列方法來方便地操作內(nèi)部的值。常用的方法有g(shù)et、orElse、orElseGet、orElseThrow等。

Optional的設(shè)計也考慮了函數(shù)式編程的原則,可以與Lambda表達(dá)式和StreamAPI等特性結(jié)合使用,可以進(jìn)行鏈?zhǔn)秸{(diào)用替代命令式編程的方式通過編寫if條件語句檢查null值。

二、Optional對象的方法

首先我們需要創(chuàng)建兩個類,User類與UserRepository類。

User類

import java.util.Optional;

public class User {
    String name;
    String fullName;

    public User(String name, String fullName) {
        this.name = name;
        this.fullName = fullName;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getFullName() {
        return fullName;
    }

    public void setFullName(String fullName) {
        this.fullName = fullName;
    }
}

UserRepository類

import java.util.Optional;

public class UserRepository {
    public User findUserByName(String name){
        if(name.equals("Peter")){
            return new User("Peter","Peter Parker");
        }
        else {
            return null;
        }
    }
}

1.isPresent、isEmpty方法

isPresent方法用于檢查optional內(nèi)是否存在值,返回為布爾值,存在為true,不存在為false。

isEmpty方法用于檢查optional內(nèi)是否為空,返回為布爾值,為空為true,不為空為false。

		//創(chuàng)建值為null的Optional對象
		Optional<Object> optionalBox = Optional.empty();
		System.out.println(optionalBox.isPresent());
		System.out.println(optionalBox.isEmpty());

返回值為false與true。

2.empty、of、ofNullable方法

若創(chuàng)建的對象為null,則可以采用empty()方法。

		Optional<Object> optionalBox = Optional.empty();

創(chuàng)建不為null的對象需要調(diào)用of方法,此時若value為null,則拋出NullPointerException異常。

        String value = "Peter";
        Optional<String> optionalBox = Optional.of(value);

若想要創(chuàng)建可能為null的對象,可以使用ofNullable( )方法。

        String value = "Peter";
        Optional<String> optionalBox = Optional.ofNullable(value);

3.get、orElse、orElseGet與orElseThrow方法

取值可以使用get()方法,若取值對象為null,會報java.util.NoSuchElementException異常(并非java.lang.NullPointerException異常)。

        String value2 = optionalBox.get();
        System.out.println(value2);

我們這里修改UserRepository類中的findUserByName方法,使其返回值為Optional對象。

    public Optional<User> findUserByName(String name){
        if(name.equals("Peter")){
            return Optional.of(new User("Peter","Peter Parker"));
        }
        else {
            return Optional.empty();
        }
    }

orElse是Optional類中的一個重要方法,它用于獲取值或在值為空的情況下提供一個默認(rèn)值。

        UserRepository userRepository = new UserRepository();
        Optional<User> optionalUser = userRepository.findUserByName("Peter2");
        User user = optionalUser.orElse(new User("Stark","Tony Stark"));
        System.out.println(user.getFullName());

orElse方法即使讀到的數(shù)據(jù)不為null,仍會創(chuàng)建一個新User對象。因此最好使用只有讀到的數(shù)據(jù)為null的時候才會新建對象的orElseGet方法。
orElseGet方法的參數(shù)為Supplier的函數(shù)式接口,需要使用Lambda表達(dá)式實現(xiàn)。

        optionalUser.orElseGet(()->new User("Stark","Tony Stark"));
        System.out.println(user.getFullName());

orElseThrow方法用于在 Optional 對象中的值為空時拋出一個指定的異常。
orElseThrow方法通過Supplier的函數(shù)式接口,可以生成自定義異常,默認(rèn)拋出異常為java.util.NoSuchElementException。

        UserRepository userRepository = new UserRepository();
        Optional<User> optionalUser = userRepository.findUserByName("Peter2");
        optionalUser.orElseThrow(()->new RuntimeException("User not found"));

4.ifPresent、ifPresentOrElse、filter方法

ifPresent方法參數(shù)中若對象不為null,則會執(zhí)行Labmda中的方法;

若參數(shù)對象為null,則不會執(zhí)行Labmda中的方法,也不會報錯。

        UserRepository userRepository = new UserRepository();
        Optional<User> optionalUser = userRepository.findUserByName("Peter2");
        optionalUser.ifPresent(user -> System.out.println(user.getFullName()));

當(dāng)我們希望值為空時進(jìn)行其他操作,需要使用ifPresentOrElse方法。

        optionalUser.ifPresentOrElse(user -> System.out.println(user.getFullName()),
                ()->System.out.println("User not found"));

若滿足filter方法中的條件,則會返回包含值的Optional對象,如果不滿足,則返回空的Optional對象

        Optional<User> optionalUser2 = optionalUser.filter(user -> user.getFullName().equals("Peter Parker"));
        System.out.println(optionalUser2.isPresent());

5.Map與flatMap方法

進(jìn)行兩個方法前需要將User類中的 getFullName方法返回值修改為Optional。

    public Optional<String> getFullName(){
        return Optional.ofNullable(fullName);
    }

map方法:對Optional中的值進(jìn)行轉(zhuǎn)換(若值為空,則map方法什么也不會做,直接返回空的Optional對象)。
這個變換基于提供該map的函數(shù),并且這個變換是可選的,如果optional的值為空則不會做任何改變,并且map方法不會改變原始的Optional對象,而返回新的Optional對象,因此可以鏈?zhǔn)秸{(diào)用進(jìn)行多個轉(zhuǎn)換操作。

        UserRepository userRepository = new UserRepository();
        Optional<User> optionalUser = userRepository.findUserByName("Peter");
        Optional<String> optionalFullName = optionalUser.map(User::getFullName);
        System.out.println(optionalFullName.get());

flatmap方法用于扁平化嵌套的Optional結(jié)構(gòu),以避免引入不必要的嵌套層級,具體為flatmap的轉(zhuǎn)換函數(shù)返回的必須是另一個Optional對象,意味著flatMap方法可以用于嵌套的Optional情況,可以將兩個為嵌套關(guān)系的Optional對象轉(zhuǎn)換為一個。如果原始的Optional對象為空,或轉(zhuǎn)換函數(shù)返回的Optional對象為空,那么最終得到的也是為空的Optional對象。

        UserRepository userRepository = new UserRepository();
        Optional<User> optionalUser = userRepository.findUserByName("Peter");
        Optional<String> optional = optionalUser.flatMap(User::getFullName);

若只需要對Optional對象中的值進(jìn)行轉(zhuǎn)換,而不需要嵌套的Optional,那么使用map方法更合適
如果要進(jìn)行一些操作返回另外一個Optional對象,flatmap方法更合適。

6.Stream方法

Optional的stream方法,可以將Optional對象轉(zhuǎn)換為Stream對象,對其中的值進(jìn)行流操作,如果Optional對象包含值,則將這個值封裝到一個Stream流中,如果Optional對象為空,則創(chuàng)造一個為空的Stream流

        UserRepository userRepository = new UserRepository();
        Optional<User> optionalUser = userRepository.findUserByName("Peter");
        Stream<String> a =optionalUser.map(User::getName).stream();
        a.forEach(System.out::println);

三、不適合使用Optional對象的情況

不應(yīng)該用于類的字段,會增加內(nèi)存消耗,并使序列化變得復(fù)雜;

不應(yīng)該用于方法參數(shù),使方法的理解和使用變得復(fù)雜;

不應(yīng)用于構(gòu)造器參數(shù),迫使調(diào)用者創(chuàng)建Optional實例,應(yīng)該通過構(gòu)造器重載解決;

不應(yīng)該用于集合的參數(shù),集合已經(jīng)很好的處理空集合的情況,沒必要使用Optional包裝集合;

不建議使用get方法,若為null會報錯。

以下是如何處理和避免Java8 Optional錯誤的一些建議:

在使用get()方法之前,一定要使用isPresent()方法檢查Optional對象是否存在。

不要使用isPresent()方法和orElse()方法。而應(yīng)該使用orElseGet()方法,讓程序只在需要時才執(zhí)行Supplier。

Optional<String> name = Optional.ofNullable(null);
System.out.println("Name: " + name.orElseGet(() -> "Default Name"));

不要將Optional作為類的字段或方法的參數(shù)。這會導(dǎo)致類或方法變得混亂且難以維護(hù)。盡可能將Optional用于返回值,只在有需要時才將其用于參數(shù)。

避免在遞歸方法中使用Optional。在Java中遞歸是簡潔明了的,但在遞歸方法中使用Optional 會導(dǎo)致程序的性能大幅下降。

總結(jié)

以上就是今天要講的內(nèi)容,本文簡單介紹了Optional對象的使用以及不適合使用Optional對象的情況。

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

相關(guān)文章

  • 深入理解Java中的弱引用

    深入理解Java中的弱引用

    這篇文章主要介紹了深入理解Java中的弱引用,本文講解了強(qiáng)引用、弱引用、引用隊列、四種引用、軟引用、虛引用等內(nèi)容,需要的朋友可以參考下
    2015-01-01
  • 基于Struts文件上傳(FormFile)詳解

    基于Struts文件上傳(FormFile)詳解

    下面小編就為大家?guī)硪黄赟truts文件上傳(FormFile)詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • springboot配置嵌入式servlet容器的方法

    springboot配置嵌入式servlet容器的方法

    這篇文章主要介紹了springboot配置嵌入式servlet容器的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Java?static關(guān)鍵字詳細(xì)解析

    Java?static關(guān)鍵字詳細(xì)解析

    這篇文章主要介紹了Java?static關(guān)鍵字詳細(xì)解析,java中的static關(guān)鍵字主要用于內(nèi)存管理,可以用在變量、方法、代碼塊和嵌套類中。更多相關(guān)介紹,需要的小伙伴可以參考一下
    2022-08-08
  • Java fastjson2 解析JSON用法詳解

    Java fastjson2 解析JSON用法詳解

    Fastjson2是Fastjson的升級版,提供了更好的性能和擴(kuò)展性,它支持多種方式解析JSON數(shù)據(jù),包括將JSON字符串轉(zhuǎn)換為Java對象、嵌套的JSON對象和數(shù)組,以及轉(zhuǎn)換成Map或List,本文介紹Java fastjson2 解析JSON用法,感興趣的朋友一起看看吧
    2025-02-02
  • Mybatis學(xué)習(xí)總結(jié)之mybatis使用建議

    Mybatis學(xué)習(xí)總結(jié)之mybatis使用建議

    這篇文章主要介紹了Mybatis學(xué)習(xí)總結(jié)之mybatis使用建議的相關(guān)資料,非常具有參考借鑒價值,需要的朋友可以參考下
    2016-05-05
  • Java將RTF轉(zhuǎn)換為PDF格式的實現(xiàn)

    Java將RTF轉(zhuǎn)換為PDF格式的實現(xiàn)

    本文主要介紹了Java將RTF轉(zhuǎn)換為PDF格式的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Java實現(xiàn)簡單修改文件名的方法分析

    Java實現(xiàn)簡單修改文件名的方法分析

    這篇文章主要介紹了Java實現(xiàn)簡單修改文件名的方法,結(jié)合具體實例分析了2種比較常用的java文件名修改方法,需要的朋友可以參考下
    2017-09-09
  • idea創(chuàng)建properties文件,解決亂碼問題

    idea創(chuàng)建properties文件,解決亂碼問題

    這篇文章主要介紹了idea創(chuàng)建properties文件,解決亂碼問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 基于Java SSM的健康管理小程序的實現(xiàn)

    基于Java SSM的健康管理小程序的實現(xiàn)

    本篇文章主要為大家分享了基于SSM健康管理小程序的設(shè)計與實現(xiàn)。感興趣的小伙伴可以了解一下
    2021-11-11

最新評論

长武县| 正阳县| 鹰潭市| 夏河县| 长白| 孝昌县| 肥东县| 姜堰市| 黎平县| 福州市| 藁城市| 汉川市| 陈巴尔虎旗| 英山县| 从江县| 图木舒克市| 即墨市| 滦平县| 宁安市| 永春县| 邯郸市| 呼图壁县| 富锦市| 靖江市| 沈阳市| 商水县| 苍溪县| 长沙市| 大田县| 临安市| 永安市| 江孜县| 丰都县| 龙游县| 沽源县| 花垣县| 南阳市| 轮台县| 宜都市| 互助| 荣成市|