作者:詩意的凌峰| http://suo.im/5t3akh在沒有空引的情況下使用Optional句子,您還喜歡以下代碼在同一句子中為空嗎?如果是這樣,請看一下Optional相對于傳統(tǒng)null確定的優(yōu)勢。
Java8的Optional為空,簡化了空確定的操作為什么在傳統(tǒng)類中為什么將Optional用于空確定?它是什么?您還看過上面的圖片。
一旦代碼量變大并且條件增加,代碼將變得非常冗余且難以維護。
然后,我們此時需要了解Optional。
Optional類是一個可以為null的容器對象。
如果該值存在,則isPresent()方法將返回true,而調(diào)用get()方法將返回該對象。
可選的是容器:它可以保存T類型的值,或者僅可以為null。
Optional提供了許多有用的方法,因此我們無需顯式檢查空值。
Optional類的引入是對空指針異常的一個很好的解決方案。
可選的方法,如下圖所示,java8的可選判斷,簡化的空判斷可選方法-圖1 java8的可選判斷,簡化的空判斷可選方法-圖2需要多說一些關(guān)于別人的事情。
我相信你們所有人都會一目了然;如何使用它,我將使用代碼進行演示,請繼續(xù)。
可選示例1.of:為非空值創(chuàng)建一個Optional。
of方法通過工廠方法創(chuàng)建Optional類。
應(yīng)該注意的是,創(chuàng)建對象時傳入的參數(shù)不能為null。
如果傳入?yún)?shù)為null,則將引發(fā)NullPointerException。
可選可選= Optional.of(“ xiaoming”); //傳入null并拋出NullPointerException可選o = Optional.of(null); 2.ofNullable:為指定的值創(chuàng)建一個Optional,如果指定的值為null,則返回一個空的Optional。
可選o1 = Optional.ofNullable(null); 3.isPresent:如果該值存在,則返回true,否則返回false。
可選optiona2 = Optional.of(“ xiaoming”); System.out.println(optiona2.isPresent()); 4.get:如果有值,則返回可選值,不拋出NoSuchElementException。
可選o1 =可選.ofNullable(null); System.out.println(o1.get()); 5.ifPresent:如果Optional具有值,則調(diào)用使用者以進行處理,否則不處理Optional o1 = Optional.ofNullable(null); o1.ifPresent(s-> System.out.println(s)); 6.orElse:如果有一個值,則將其返回,否則返回其他指定值可選。
ofNullable(null); System.out.println(o1.orElse(“ output orElse”))); //輸出orElse 7.。
orElseGet:orElseGet與orElse方法類似,不同之處在于獲得的默認值。
orElse方法使用傳入的字符串作為默認值,而orElseGet方法可以接受Supplier接口的實現(xiàn)以生成默認值。
System.out.println(o1.orElseGet(())->“默認值”)); //默認值*注意:orElse和orElseGet看起來很相似,但實際上它們是完全不同的;請看以下示例Shop shop = null; System.out.println(“ testorElse”); Optional.ofNullable(shop).orElse(createNew()); System.out.println(“ testorElseGet”);可選。
ofNullable(shop).orElseGet(()-> createNew()); // createNewprivate靜態(tài)Shop createNew(){System .out.println(“ create new”); return new Shop(“ stockings”,50);} //輸出:測試orElsecreate newtest orElseGetcreate newShop shop = new Shop(“長襪”,100); System.out。
println(“ testorElse”); Optional.ofNullable(shop).orElse(createNew()); System.out.println(“ testorElseGet”); Optional.ofNullable(shop).orElseGet(()-> createNew( )); ///輸出測試orElsecreate newtest orElseGet從上面的兩個示例中,您可以看到,當(dāng)Optional為空時,orElse和orElseGet差別不大,但是當(dāng)Optional具有值時,orElse仍將調(diào)用該方法來創(chuàng)建該對象,而orElseGet沒有。
該方法將再次被調(diào)用;當(dāng)我們處理的業(yè)務(wù)數(shù)據(jù)量很大時,兩者的性能將有很大的不同。
8.orElseThrow:如果有值,則將其返回,否則拋出由供應(yīng)商接口創(chuàng)建的異常。
可選o1 =可選.ofNullable(null); try {o1.orElseThrow(()-> newException(“ Exception!”)));} catch(Exception e){System.out.println(“ info:” ; + e。
getMessage());} //輸出:info:異常! 9.map:如果有一個值,則執(zhí)行它并調(diào)用映射函數(shù)以獲取返回值。
如果返回值不為null,則創(chuàng)建一個Optional,它包含映射的返回值作為map方法的返回值,否則返回一個空的Optional。
可選可選= Optional.of(“ xiaoming”);字符串s = o