這篇文章主要介紹“java.util.Optional怎么使用”,在日常操作中,相信很多人在java.util.Optional怎么使用問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”java.util.Optional怎么使用”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
成都創(chuàng)新互聯(lián)公司主營(yíng)東坡網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,APP應(yīng)用開(kāi)發(fā),東坡h5小程序制作搭建,東坡網(wǎng)站營(yíng)銷推廣歡迎東坡等地區(qū)企業(yè)咨詢
第一種. Optional.of(Object object):入?yún)bject不能為空,否則會(huì)拋出空指針異常,查看Optional源碼發(fā)現(xiàn)會(huì)調(diào)用Objects.requireNonNull方法,里面有判空:
public staticT 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ì)象,類型分別是String和Integer,代碼如下:
OptionaloptionalStr = Optional.ofNullable(null); Optional optionalInt = Optional.ofNullable(null);
類型不同又如何保證返回同一個(gè)對(duì)象呢?直接看ofNullable的源碼,發(fā)現(xiàn)會(huì)調(diào)用empty方法:
public staticOptional empty() { @SuppressWarnings("unchecked") Optional t = (Optional ) 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ù)名稱從其他系統(tǒng)獲取student對(duì)象,如果對(duì)象為空就返回默認(rèn)對(duì)象,先看不用Optional的時(shí)候我們平常是怎么寫的,如下代碼所示,標(biāo)準(zhǔn)的if&else判斷:
private Student queryById(int id){ //TODO 這里模擬從數(shù)據(jù)庫(kù)查詢 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ù)查詢 return null; } public Student getStudent(int id){ Optionaloptional = 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ù)查詢 return null; } private Student getDefault(){ return DEFAULT; } public Student getStudent(int id){ Optionaloptional = Optional.ofNullable(queryById(id)); //如果為空就返回DEFAULT對(duì)象 return optional.orElseGet(() -> getDefault()); }
###Optional的map方法### 假如我們的需求是student對(duì)象非空就返回name的大寫,如果student對(duì)象為空就返回"invalid",在沒(méi)有Optional的時(shí)候?qū)懛ㄈ缦?,除了檢查student變量是否為空,還要檢查name是否為空:
private Student queryById(int id){ //TODO 這里模擬從數(shù)據(jù)庫(kù)查詢 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 這里模擬從數(shù)據(jù)庫(kù)查詢 return null; } public String getStudentUpperName(int id){ Optionaloptional = Optional.ofNullable(queryById(id)); return optional.map(student -> student.getName()) .map(name -> name.toUpperCase()) .orElse("invalid"); }
由以上代碼可以看到,map可以將一個(gè)Optional對(duì)象轉(zhuǎn)換成另一個(gè),第一次是將Optional
本次實(shí)戰(zhàn)的源碼已經(jīng)上傳到git上,地址是git@github.com:zq2599/blog_demos.git,里面有多個(gè)工程,本次用到的是optionaldemo,如下圖紅框所示:
到此,關(guān)于“java.util.Optional怎么使用”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!