亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java.util.Optional怎么使用

發布時間:2021-12-13 14:45:04 來源:億速云 閱讀:252 作者:iii 欄目:云計算

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

 第一種. Optional.of(Object object):入參object不能為空,否則會拋出空指針異常,查看Optional源碼發現會調用Objects.requireNonNull方法,里面有判空:

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

第二種. Optional.ofNullable(Object object):入參object可以為空,如果object不為空,就創建一個Optional實例;如果object為空就返回一個static fainal的Option對象,注意這里不會新建Option實例,而是使用一個static final的實例EMPTY,這里比較有意思的是泛型的問題,例如我需要兩個Optional對象,類型分別是String和Integer,代碼如下:

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

類型不同又如何保證返回同一個對象呢?直接看ofNullable的源碼,發現會調用empty方法:

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

原來是通過強制轉換實現的,再看EMPTY對象:

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

是通過"?"聲明的;

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

Optional.of()方法的用法有點像斷言,對象為空的時候代表著某種業務上不可接受的異常,需要盡早處理,并且業務拒絕執行,這種場景下可以使用Optional.of;

接下來我們開始實戰吧;

###例子中用到的對象:Student### Student是個普通的bean,有三個字段和對應的get&set方法

package com.bolingcavalry;

/**
 * @author willzhao
 * @version V1.0
 * @Description: 一個普通的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的用法### 下面舉例說明最常用的Optional.ofNullable,我們打算根據名稱從其他系統獲取student對象,如果對象為空就返回默認對象,先看不用Optional的時候我們平常是怎么寫的,如下代碼所示,標準的if&else判斷:

	private Student queryById(int id){
        //TODO 這里模擬從數據庫查詢
        return null;
    }

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

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

用Optional之后,如下所示,不需要通過判空來避免空指針異常了:

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

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

orElse方法可以指定一個value為空時的返回對象,如果這個對象需要調用方法才能獲取(例如我們拿不到DEFAULT對象,要通過getDefault()方法才能拿到),這是就需要orElseGet方法來達到目的,如下:

private Student queryById(int id){
	//TODO 這里模擬從數據庫查詢
    return null;
}

private Student getDefault(){
	return DEFAULT;
}

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

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

###Optional的map方法### 假如我們的需求是student對象非空就返回name的大寫,如果student對象為空就返回"invalid",在沒有Optional的時候寫法如下,除了檢查student變量是否為空,還要檢查name是否為空:

private Student queryById(int id){
        //TODO 這里模擬從數據庫查詢
        return null;
}

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

    return "invalid";
}

用了Optional可以這么寫:

private Student queryById(int id){
	//TODO 這里模擬從數據庫查詢
	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可以將一個Optional對象轉換成另一個,第一次是將Optional<Student>轉換成了Optional<String>,第二次是將Optional<String>轉成了另一個Optional<String>,只是這次將字符串換成了大寫;

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

java.util.Optional怎么使用

到此,關于“java.util.Optional怎么使用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新宾| 鲁甸县| 乃东县| 石嘴山市| 景泰县| 武川县| 文安县| 莱州市| 怀集县| 临邑县| 镇宁| 邯郸县| 勐海县| 镇平县| 公主岭市| 仲巴县| 新余市| 贡觉县| 留坝县| 吴堡县| 靖州| 措美县| 巴楚县| 禄劝| 阜新| 固原市| 昆明市| 宁南县| 长寿区| 滕州市| 伊金霍洛旗| 广元市| 宁化县| 容城县| 图木舒克市| 育儿| 西昌市| 淄博市| 霍州市| 吴忠市| 苍山县|