超有效的避免項目中讓你頭疼的空指針異常---Optional類

注:按照我寫的代碼敲碍遍,你就會懂

Optional是java8作為新特性引入的類庫,它是受到Guava啟發(fā)伪冰,用于避免空指針問題的類;

可以用來替代如下代碼

? if (null==value) {

? ?} else {

? ?}

1哄芜、創(chuàng)建對象

//創(chuàng)建空的Optional對象

Optional.empty();

//創(chuàng)建非空Option對象,如果值為空會報空指針異常

Optional.of("wyn");

//創(chuàng)建Optional對象貌亭,任意值

Optional.ofNullable("");

2、orElse(),orElseGet()

******************************String的判斷**********************************

public void contextLoads() {

? ??String value1=null;

? ??String value2="我不是空值";

??? ??// 代碼解析:判斷value1是否為null认臊,如果為null圃庭,走orElse里面的empty方法,如果不為空直接返回value1失晴,即resultValue1=value1

????String resultValue1=Optional.ofNullable(value1).orElse(empty());

??? ?// 同上

????String resultValue2=Optional.ofNullable(value2).orElse(empty());

????System.out.println(resultValue1);//我是空值

????System.out.println(resultValue2);//我不是空值

? ?}

public String empty() {

????return "我是空值";

}

******************************實體類user的判斷*********************************

//? 實體類user

@Data

@RequiredArgsConstructor

public class User {

? ??private static final long serialVersionUID =1L;

? ??@NonNull?

? ??private String id;

? ??@NonNull

? ???private String loginId;

? ???private String password;

}

public void contextLoads() {

????User user1 = null;

? ??//UUIDHelper.getUuid()可以生成隨機字數(shù)數(shù)字組合做主鍵

????User user2 = new User (UUIDHelper.getUuid(),"我不是空值");

????// 代碼解析:判斷user1?是否為null剧腻,如果為null,走orElse里面的empty方法涂屁,如果不為空直接返回user1?书在,即resultValue1=user1?

????User resultValue1 = Optional.ofNullable(user1).orElse(empty());

? ??// 同上

????User resultValue2 = Optional.ofNullable(user2).orElse(empty());

????System.out.println(resultValue1); //User(id=77a349b51df140229008577ecd074bff, loginId=我是空值, password=null)

????System.out.println(resultValue2); //User(id=019213e5f2b74552aa1410de6618ee1f, loginId=我不是空值, password=null)

?? }

public User empty() {

? ??//UUIDHelper.getUuid()可以生成隨機字數(shù)數(shù)字組合做主鍵

????return new User(UUIDHelper.getUuid(),"我是空值");

?}

*******************************List的判斷***********************

@Test

public void contextLoads() {

????List<User> user1List = Lists.newArrayList();

????user1List.add(null);

? ??// 代碼解析:判斷user1List?是否為null,如果為null拆又,走orElse里面的empty方法儒旬,如果不為空直接返回user1?,即resultValue1=user1List?

? ??// 劃重點L濉U辉础!Optional對于集合判斷有bug竖般,下面做解釋

????List<User> resultValue1 = Optional.ofNullable(user1List).orElse(empty());

????System.out.println(JSONObject.toJSONString(resultValue1));//[null]

}

public Liste mpty() {

????List<User> userList = Lists.newArrayList();

????userList.add (newUser(UUIDHelper.getUuid(),"我是空值"));

????return userList;

?}

按照上面寫法,List<User> user1List = Lists.newArrayList();?即???List<User> user1List = new ArrayList<>(); 雖然user1List雖然里面為空艰亮,但是會返回size=0胞谭,Optional只能判斷為null的值,像這種Optional會認為它有值丈屹,判斷不準確?,所以對于List的判斷最好使用 CollectionUtils去判斷彩库。但是如果直接寫List<User> user1List =null先蒋;Optional會判斷出來。

orElseGet()方法與orElse()方法類似竞漾,區(qū)別在于orElseGet()方法的入?yún)⑹且粋€接口

源碼:

? ?public T orElseGet(Supplier<?extendsT> other) {

? ? ?????return value != nul l? value:other.get();

? ? }

? ?public T orElse (T other) {

??? ????return value != null?value:other;

? ? }

舉一個例子:orElseGet判斷String

public void contextLoads() {

??? ????String value1 = null;

?? ?????String value2 = "我不是空值";

??? ????String resultValue1 = Optional.ofNullable(value1).orElseGet(()->empty());

??? ????String resultValue2 = Optional.ofNullable(value2).orElseGet(()->empty());

??? ????System.out.println(resultValue1);//我是空值

?? ?????System.out.println(resultValue2);//我不是空值

?? }

public String empty() {

?? ?????return "我是空值";

?}

3、orElseThrow

@Test

public void contextLoads() {

? ??String value = null;

? ???//代碼解析:?如果value值為null鳞仙,會拋出一個你定義的異常

? ??Optional.ofNullable(value).orElseThrow(()->newRuntimeException("我是空值"));

?}

4、ifPresent()

@Test

public void contextLoads() {

????String value = "我不是空值";

? ???//代碼解析: 如果value不為空仗岸,則執(zhí)行?ifPresent里面的代碼

????Optional.ofNullable(value).ifPresent(item->System.out.println(item));

?}

5、isPresent()(最好不要使用)

String value="我不是空值";

?//代碼解析: 判斷value是否為null借笙,返回布爾值扒怖,這個方法沒啥用,因為isPresent一般是寫在if里面判斷的业稼,但是既然用if判斷是否為空盗痒,為什么不用上面說的兩個方法呢?

boolean b = Optional.ofNullable(value).isPresent();

System.out.println(b);

6盼忌、解釋

String value = "我不是空值";

String resultValue = Optional.ofNullable(value ).orElseGet(() -> empty());

說明的是如果value 不為空resultValue ==value积糯,如果為空orElseGet里面執(zhí)行對應(yīng)的一些操作;

Optional.ofNullable(value).ifPresent(item -> System.out.println(item));

說明的是如果value不為空谦纱,執(zhí)行對應(yīng)的操作看成,為空就不走這個方法;

7跨嘉、總結(jié)

Optional對于除了集合外的判斷都可以很好的使用川慌。

Optional并不是解決NullPointerException問題,但是它提供了一種機制祠乃,這種機制可以讓方法的調(diào)用者非常明確的知道這個變量中有可能不存在任何值梦重,這樣就會強迫調(diào)用者去考慮,如果沒有值自己應(yīng)該怎么去處理亮瓷。換句話說就是琴拧,開發(fā)過程中讓你不會忘記空值的判斷與處理,能有效避免空指針問題嘱支。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蚓胸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子除师,更是在濱河造成了極大的恐慌沛膳,老刑警劉巖汛聚,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叹哭,死亡現(xiàn)場離奇詭異风罩,居然都是意外死亡泊交,警方通過查閱死者的電腦和手機廓俭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門诉植,熙熙樓的掌柜王于貴愁眉苦臉地迎上來敬惦,“玉大人谣膳,你說我怎么就攤上這事继谚』模” “怎么了诡壁?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵旺矾,是天一觀的道長宠漩。 經(jīng)常有香客問我,道長懊直,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任雕崩,我火速辦了婚禮盼铁,結(jié)果婚禮上鹏控,老公的妹妹穿的比我還像新娘肤寝。我一直安慰自己鲤看,他們只是感情好义桂,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布袖裕。 她就那樣靜靜地躺著陆赋,像睡著了一般攒岛。 火紅的嫁衣襯著肌膚如雪灾锯。 梳的紋絲不亂的頭發(fā)上顺饮,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天,我揣著相機與錄音赦肋,去河邊找鬼。 笑死囱井,一個胖子當著我的面吹牛庞呕,可吹牛的內(nèi)容都是我干的住练。 我是一名探鬼主播澎羞,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼枫攀,長吁一口氣:“原來是場噩夢啊……” “哼株茶!你這毒婦竟也來了蹦掐?” 一聲冷哼從身側(cè)響起僵闯,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤社裆,失蹤者是張志新(化名)和其女友劉穎泳秀,沒想到半個月后嗜傅,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體檩赢,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡坞靶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了尿这。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片射众。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖断盛,靈堂內(nèi)的尸體忽然破棺而出钢猛,到底是詐尸還是另有隱情命迈,我是刑警寧澤淑倾,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布踊淳,位于F島的核電站,受9級特大地震影響剪芥,放射性物質(zhì)發(fā)生泄漏税肪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一箭券、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧废亭,春花似錦豆村、人聲如沸掌动。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恋追。三九已至苦囱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間羹铅,已是汗流浹背职员。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工扮授, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人专肪。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓刹勃,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嚎尤。 傳聞我的和親對象是個殘疾皇子荔仁,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361