注:按照我寫的代碼敲碍遍,你就會懂
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ā)過程中讓你不會忘記空值的判斷與處理,能有效避免空指針問題嘱支。