Java8新特性O(shè)ptional常用方法
前言
optional 是Java8 util包中的類,我們?yōu)榱吮苊饪罩羔槷惓?NullPointerException),經(jīng)常要寫好多類似if(a!=null){...},optional就是為了解決這些問題,讓代碼看起來更nb。
(一)Optional.ofNullable(e).ifPresent()
此方法是當(dāng)傳入的對象為不為空(e!=null)時,才會執(zhí)行ifPresent()中的代碼,e==null時什么都不會執(zhí)行,也不會拋異常。
//空對象 不會執(zhí)行 Optional.ofNullable(null).ifPresent(e -> { System.out.println("空"); }); //空字符串時會執(zhí)行 Optional.ofNullable("").ifPresent(e -> { System.out.println("空字符串"); }); //空格 也會執(zhí)行 Optional.ofNullable(" ").ifPresent(e -> { System.out.println("空格"); });
輸出:
空字符串
空格
(二)Optional.ofNullable(e).orElse()
orElse()方法,當(dāng) Optional 中有值則將其返回,為空時返回 orElse 方法傳入的參數(shù)。
此方法可以替代三目運算符使用。
//為空時返回orElse中的值 System.out.println(Optional.ofNullable(null).orElse("默認值")); //輸出 默認值 //不為空時 System.out.println(Optional.ofNullable("我不是空").orElse("默認值")); //輸出 我不是空
(三)Optional.ofNullable(e).orElseGet()
orElseGet方法,當(dāng)Optional 中值為空時,orElseGet與orElse效果是一樣的。當(dāng)Optional 中有值時,兩者才有區(qū)別,上代碼。
//當(dāng)參數(shù)為空時 String a = (String) Optional.ofNullable(null).orElse(get("a")); System.out.println("a="+a); String b = (String) Optional.ofNullable(null).orElseGet(() -> get("b")); System.out.println("b="+b); 輸出 a:我執(zhí)行了 a=a b:我執(zhí)行了 b=b //參數(shù)不為空是 String c = Optional.ofNullable("notnull").orElse(get("c")); System.out.println("c="+c); String d = Optional.ofNullable("我不是空").orElseGet(() -> get("d")); System.out.println("d="+d); 輸出 c:我執(zhí)行了 c=notnull (此處沒有 執(zhí)行) d=我不是空 private static String get(String s) { System.out.println(s + ":我執(zhí)行了"); return s; }
可以看到,當(dāng)參數(shù)不為空時,orElseGet中的方法是沒有執(zhí)行的。
(四)Optional.ofNullable(e).filter()
filter個方法通過傳入的定條件對Optional實例的值進行過濾,它可以配合著.ifPresent()方法和.orElse()使用
Optional.ofNullable("notnull").filter(t -> "notnull".equals(t)).ifPresent(t2 -> System.out.println("成立時我才會執(zhí)行")); 輸出 成立時我才會執(zhí)行 String a=Optional.ofNullable("notnull").filter(t -> "null".equals(t)).orElse(("不成立時我才會執(zhí)行")); System.out.println("a="+a); String b=Optional.ofNullable("notnull").filter(t -> "notnull".equals(t)).orElse(("不成立時我才會執(zhí)行")); System.out.println("b="+b); 輸出 a=不成立時我才會執(zhí)行 b=notnull
補充:Optional的用法代碼案例
示例1:
String s = Optional.ofNullable(user) .map(o -> o.getUsername()) .orElseGet(() -> { return "李四";});
用法說明:Optional.ofNullable(user)是判斷user是否為null,如果為null,則不會執(zhí)行map(o -> o.getUsername()),直接執(zhí)行orElseGet(() -> { return “李四”;})方法。如果不為null,則只執(zhí)行map(o -> o.getName())方法。
還有一個跟orElseGet()類似的方法:orElse(),orElse()方法不管ofNullable()值是否為null,都會執(zhí)行orElse()的代碼,而orElseGet()方法只有在ofNullable()值為null時才會執(zhí)行傳入的函數(shù)。
示例2:
有如下代碼,需要獲得Test2中的Info信息,但是參數(shù)為Test4,我們要一層層的申請,每一層都獲得的對象都可能是空,最后的代碼看起來就像這樣。
public String testSimple(Test4 test) { if (test == null) { return ""; } if (test.getTest3() == null) { return ""; } if (test.getTest3().getTest2() == null) { return ""; } if (test.getTest3().getTest2().getInfo() == null) { return ""; } return test.getTest3().getTest2().getInfo(); }
但是使用Optional后,整個就都不一樣了。
public String testOptional(Test test) { return Optional.ofNullable(test) .flatMap(Test::getTest3) .flatMap(Test3::getTest2) .map(Test2::getInfo) .orElse(""); }
示例3:
Optional.ofNullable(user).ifPresent(o -> o.setUsername("李四"));
如果user不為null,執(zhí)行ifPresent()方法,否則不執(zhí)行ifPresent()方法,這與orElseGet()用法剛好相反。
示例4:
.查詢用戶信息,如果沒有則新建用戶,并將新建的用戶信息返回
User user = Optional.ofNullable( baseMapper.selectOne( new QueryWrapper<User>() .lambda() .eq(User::getAlipayUserId, result.getUserId()) .eq(User::getDelFlag, false) )).orElseGet(()-> { User newUser = User.builder() .relation(User.Relation.Unrelated) .authentication(false) .status(User.Status.Normal) .updateUserId(User.DEFAULT_USER_ID) .createUserId(User.DEFAULT_USER_ID) .roles(User.ROLE_USER_INFO) .alipayUserId(alipayUserId) .build(); this.save(newUser); return newUser; });
示:5:
Optional.ofNullable( baseMapper.selectOne(new QueryWrapper<User>().lambda().eq(User::getMobileNumber, phone)) ).filter(user -> { if (StringUtils.isNotBlank(user.getAlipayUserId()) && user.getAlipayUserId().equals(userId)) { return true; } baseMapper.physicalDeleteByUserId(userId); baseMapper.update(new User(), new UpdateWrapper<User>().lambda() .set(User::getAlipayUserId, userId) .set(User::getUpdateTime, LocalDateTime.now()) .eq(User::getMobileNumber, phone)); return true; }).orElseGet(() -> { baseMapper.update(new User(), new UpdateWrapper<User>().lambda() .set(User::getMobileNumber, phone) .set(User::getUpdateTime, LocalDateTime.now()) .eq(User::getAlipayUserId, userId)); return null; });
filter()方法的用法:只有Optional.ofNullable()不為空時,才會執(zhí)行filter()方法,否則會直接執(zhí)行orElseGet()方法。當(dāng)執(zhí)行filter()方法時,如果方法內(nèi)返回true,則直接將Optional.ofNullable()的對象返回,如果方法內(nèi)返回false,則繼續(xù)執(zhí)行orElseGet()方法。
總結(jié)
到此這篇關(guān)于Java8新特性O(shè)ptional常用方法的文章就介紹到這了,更多相關(guān)Optional常用方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java 實現(xiàn)下壓棧的操作(能動態(tài)調(diào)整數(shù)組大小)
這篇文章主要介紹了java 實現(xiàn)下壓棧的操作(能動態(tài)調(diào)整數(shù)組大小),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02logback-spring.xml的配置及示例詳解(直接復(fù)制粘貼可用)
在使用logback作為日志框架時,可以創(chuàng)建一個名為logback-spring.xml的配置文件來自定義日志輸出的格式和方式,下面這篇文章主要給大家介紹了關(guān)于logback-spring.xml的配置及示例詳解的相關(guān)資料,文中的代碼直接復(fù)制粘貼可用,需要的朋友可以參考下2024-01-01