溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

java.util.Optional怎么使用

發(fā)布時(shí)間:2021-12-13 14:45:04 來(lái)源:億速云 閱讀:241 作者:iii 欄目:云計(jì)算

這篇文章主要介紹“java.util.Optional怎么使用”,在日常操作中,相信很多人在java.util.Optional怎么使用問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”java.util.Optional怎么使用”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

 第一種. Optional.of(Object object):入?yún)bject不能為空,否則會(huì)拋出空指針異常,查看Optional源碼發(fā)現(xiàn)會(huì)調(diào)用Objects.requireNonNull方法,里面有判空:

public static <T> T requireNonNull(T obj) {
        if (obj == null)
            throw new NullPointerException();
        return obj;
    }

第二種. Optional.ofNullable(Object object):入?yún)bject可以為空,如果object不為空,就創(chuàng)建一個(gè)Optional實(shí)例;如果object為空就返回一個(gè)static fainal的Option對(duì)象,注意這里不會(huì)新建Option實(shí)例,而是使用一個(gè)static final的實(shí)例EMPTY,這里比較有意思的是泛型的問(wèn)題,例如我需要兩個(gè)Optional對(duì)象,類(lèi)型分別是String和Integer,代碼如下:

Optional<String> optionalStr = Optional.ofNullable(null);
Optional<Integer> optionalInt = Optional.ofNullable(null);

類(lèi)型不同又如何保證返回同一個(gè)對(duì)象呢?直接看ofNullable的源碼,發(fā)現(xiàn)會(huì)調(diào)用empty方法:

public static<T> Optional<T> empty() {
        @SuppressWarnings("unchecked")
        Optional<T> t = (Optional<T>) EMPTY;
        return t;
    }

原來(lái)是通過(guò)強(qiáng)制轉(zhuǎn)換實(shí)現(xiàn)的,再看EMPTY對(duì)象:

private static final Optional<?> EMPTY = new Optional<>();

是通過(guò)"?"聲明的;

第三種. Optional.empty():就是上面分析Optional.ofNullable的時(shí)候用到的empty方法,直接返回一個(gè)static final的實(shí)例EMPTY;

Optional.of()方法的用法有點(diǎn)像斷言,對(duì)象為空的時(shí)候代表著某種業(yè)務(wù)上不可接受的異常,需要盡早處理,并且業(yè)務(wù)拒絕執(zhí)行,這種場(chǎng)景下可以使用Optional.of;

接下來(lái)我們開(kāi)始實(shí)戰(zhàn)吧;

###例子中用到的對(duì)象:Student### Student是個(gè)普通的bean,有三個(gè)字段和對(duì)應(yīng)的get&set方法

package com.bolingcavalry;

/**
 * @author willzhao
 * @version V1.0
 * @Description: 一個(gè)普通的bean
 * @email zq2599@gmail.com
 * @Date 2017/8/26 下午11:23
 */
public class Student {
    private int id;

    private String name;

    private int age;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Student(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
}

###Optional.ofNullable的用法### 下面舉例說(shuō)明最常用的Optional.ofNullable,我們打算根據(jù)名稱(chēng)從其他系統(tǒng)獲取student對(duì)象,如果對(duì)象為空就返回默認(rèn)對(duì)象,先看不用Optional的時(shí)候我們平常是怎么寫(xiě)的,如下代碼所示,標(biāo)準(zhǔn)的if&else判斷:

	private Student queryById(int id){
        //TODO 這里模擬從數(shù)據(jù)庫(kù)查詢(xún)
        return null;
    }

    public Student getStudent(int id){
        Student student = queryById(id));

        //如果為空就返回DEFAULT對(duì)象
        return student==null ? DEFAULT : student;
    }

用Optional之后,如下所示,不需要通過(guò)判空來(lái)避免空指針異常了:

private Student queryById(int id){
        //TODO 這里模擬從數(shù)據(jù)庫(kù)查詢(xún)
        return null;
    }
    
    public Student getStudent(int id){
        Optional<Student> optional = Optional.ofNullable(queryById(id));

        //如果為空就返回DEFAULT對(duì)象
        return optional.orElse(DEFAULT);
    }

orElse方法可以指定一個(gè)value為空時(shí)的返回對(duì)象,如果這個(gè)對(duì)象需要調(diào)用方法才能獲取(例如我們拿不到DEFAULT對(duì)象,要通過(guò)getDefault()方法才能拿到),這是就需要orElseGet方法來(lái)達(dá)到目的,如下:

private Student queryById(int id){
	//TODO 這里模擬從數(shù)據(jù)庫(kù)查詢(xún)
    return null;
}

private Student getDefault(){
	return DEFAULT;
}

public Student getStudent(int id){
	Optional<Student> optional = Optional.ofNullable(queryById(id));

	//如果為空就返回DEFAULT對(duì)象
    return optional.orElseGet(() -> getDefault());
}

###Optional的map方法### 假如我們的需求是student對(duì)象非空就返回name的大寫(xiě),如果student對(duì)象為空就返回"invalid",在沒(méi)有Optional的時(shí)候?qū)懛ㄈ缦?,除了檢查student變量是否為空,還要檢查name是否為空:

private Student queryById(int id){
        //TODO 這里模擬從數(shù)據(jù)庫(kù)查詢(xún)
        return null;
}

public String getStudentUpperName(int id){
	Student student = queryById(id);
	if(student!=null && student.getName()!=null){
		return student.getName().toUpperCase();
    }

    return "invalid";
}

用了Optional可以這么寫(xiě):

private Student queryById(int id){
	//TODO 這里模擬從數(shù)據(jù)庫(kù)查詢(xún)
	return null;
}

public String getStudentUpperName(int id){
	Optional<Student> optional = Optional.ofNullable(queryById(id));

    return optional.map(student -> student.getName())
                   .map(name -> name.toUpperCase())
                   .orElse("invalid");
}

由以上代碼可以看到,map可以將一個(gè)Optional對(duì)象轉(zhuǎn)換成另一個(gè),第一次是將Optional<Student>轉(zhuǎn)換成了Optional<String>,第二次是將Optional<String>轉(zhuǎn)成了另一個(gè)Optional<String>,只是這次將字符串換成了大寫(xiě);

本次實(shí)戰(zhàn)的源碼已經(jīng)上傳到git上,地址是<font color="red">git@github.com:zq2599/blog_demos.git</font>,里面有多個(gè)工程,本次用到的是optionaldemo,如下圖紅框所示:

java.util.Optional怎么使用

到此,關(guān)于“java.util.Optional怎么使用”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI