Java中的Optional使用詳細(xì)說(shuō)明
簡(jiǎn)介
java.util.Optional java1.8 官方描述:
(這是一個(gè)可以為null的容器對(duì)象。如果值存在則isPresent()方法會(huì)返回true,調(diào)用get()方法會(huì)返回該對(duì)象。)
個(gè)人理解: Optional就是相當(dāng)于把對(duì)象包了一層,將判斷空的部分代碼給單獨(dú)抽出來(lái)了,主要就是為了避免null引起的部分問(wèn)題.
Optional的使用
首先看看Optional的方法:
三個(gè)靜態(tài)方法
- Optional.empty()
返回一個(gè)空的Optional,用的不多;主要就是為了使Optional只存在有值和無(wú)值的情況,不存在包含null的情況,在后面的ofNullable方法中使用;
- Optional.of(T value)
public static <T> Optional<T> of(T value) { return new Optional<>(value); } private Optional(T value) { this.value = Objects.requireNonNull(value); } public static <T> T requireNonNull(T obj) { if (obj == null) throw new NullPointerException(); return obj; }
傳入一個(gè)非null的value值,返回一個(gè)包含value的Option;如果為null會(huì)拋出空指針異常;
- Optional.ofNullable(T value)(用的最多)
public static <T> Optional<T> ofNullable(T value) { return value == null ? empty() : of(value); }
傳入一個(gè)非null的value值,返回一個(gè)包含value的Option;
傳入一個(gè)value值,返回一個(gè)包含value的Option;可以為null,如果為null則返回一個(gè)空的Optional,就是Optional.empty(),可以看看源碼
方法介紹
Optional一般鏈?zhǔn)秸{(diào)用,方法也比較簡(jiǎn)單
- get()
- 如果該值存在,將該值直接返回,否則拋出一個(gè) NoSuchElementException 異常。
- isPresent()
- 返回該值是否存在的布爾值,存在true不存在false;
- isPresent(Consumer<? super T> consumer)
- 沒(méi)有返回值,傳入的是一個(gè)函數(shù),如果存在執(zhí)行函數(shù),不存在則不執(zhí)行
- filter(Predicate<? super T> predicate)
- filter 方法接受一個(gè) Predicate 來(lái)對(duì) Optional 中包含的值進(jìn)行過(guò)濾,如果包含的值滿足條件,那么還是返回這個(gè) Optional;否則返回 Optional.empty。
- map(Function<? super T, ? extends U> mapper)
- 對(duì)該值執(zhí)行提供的 get方法調(diào)用。
- flatMap(Function<? super T, Optional> mapper)
- 同上,只不過(guò)Function返回的時(shí)候就是Optional;而map是代碼里面幫忙封裝了.
public<U> Optional<U> map(Function<? super T, ? extends U> mapper) { Objects.requireNonNull(mapper); if (!isPresent()) return empty(); else { return Optional.ofNullable(mapper.apply(value)); } } public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) { Objects.requireNonNull(mapper); if (!isPresent()) return empty(); else { return Objects.requireNonNull(mapper.apply(value)); } }
- orElse(T other)
如果調(diào)用對(duì)象包含值,返回該值,否則返回t。
- orElseGet(Supplier<? extends T> other)
如果調(diào)用對(duì)象包含值,返回該值,否則返回 other 獲取的值。
- orElseThrow(Supplier<? extends X> exceptionSupplier)
如果調(diào)用對(duì)象包含值,返回該值,否則拋出 other 獲取的異常。
使用案例
- 判斷對(duì)象是否存在,如果存在則執(zhí)行操作
@Test public void test1() { User user = null; User retUser = new User(); retUser.setName("aaa"); retUser.setAge(33); Optional.ofNullable(retUser).ifPresent(x->{ System.out.println(x.getName()); System.out.println(x.getAge()); }); }
- 判斷對(duì)象是否為空,如果為空則返回默認(rèn)值
@Test public void test2() { // User user = new User(); User user = null; User retUser = new User(); retUser.setName("aaa"); retUser.setAge(33); User user1 = Optional.ofNullable(user).orElse(retUser); System.out.println(user1); }
- 對(duì)對(duì)象的某一屬性獲取,如果為空則獲取默認(rèn)的,好比返回用戶頭像地址,如果沒(méi)有設(shè)置則返回一個(gè)默認(rèn)的頭像地址,如果有則添加地址返回;
@Test public void test3() { User user = null; User retUser = new User(); retUser.setName("aaa"); retUser.setAge(33); String lowerName = Optional.ofNullable(user).map(u -> { return u.getName(); }).map(name -> { return name.toLowerCase(); }).orElse("默認(rèn)的名字"); System.out.println(lowerName); }
代碼
import lombok.Data; import lombok.ToString; import org.junit.Test; import java.util.Optional; public class OptionalTest { public static void main(String[] args) { User user = new User(); user.setName("yida"); user.setAge(18); Optional<Object> empty = Optional.empty(); Optional<User> user1 = Optional.of(user); Optional<User> user2 = Optional.ofNullable(user); } @Test public void test1() { User user = null; User retUser = new User(); retUser.setName("aaa"); retUser.setAge(33); Optional.ofNullable(retUser).ifPresent(x->{ System.out.println(x.getName()); System.out.println(x.getAge()); }); } @Test public void test2() { User user = null; User retUser = new User(); retUser.setName("aaa"); retUser.setAge(33); User user1 = Optional.ofNullable(user).orElse(retUser); System.out.println(user1); } @Test public void test3() { User user = null; User retUser = new User(); retUser.setName("aaa"); retUser.setAge(33); String lowerName = Optional.ofNullable(user).map(u -> { return u.getName(); }).map(name -> { return name.toLowerCase(); }).orElse("默認(rèn)的名字"); System.out.println(lowerName); } @Data @ToString private static class User{ private String name; private Integer age; } }
到此這篇關(guān)于Java中的Optional使用詳細(xì)說(shuō)明的文章就介紹到這了,更多相關(guān)Java中的Optional內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java簡(jiǎn)單實(shí)現(xiàn)SpringMVC+MyBatis分頁(yè)插件
自己最近搭建的一個(gè)SpringMVC+Mybatis的框架 屬于無(wú)實(shí)體類的框架 并實(shí)現(xiàn)了Myabtis的自動(dòng)分頁(yè)和總數(shù)查詢 只要傳入分頁(yè)參數(shù)便能自動(dòng)查詢總數(shù)和分頁(yè) 總數(shù)封裝在參數(shù)里面執(zhí)行查詢后可以直接從參數(shù)中獲取2015-09-09springboot+vue實(shí)現(xiàn)頁(yè)面下載文件
這篇文章主要為大家詳細(xì)介紹了springboot+vue實(shí)現(xiàn)頁(yè)面下載文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12java智能問(wèn)答圖靈機(jī)器人AI接口(聚合數(shù)據(jù))
這篇文章主要介紹了java智能問(wèn)答圖靈機(jī)器人AI接口(聚合數(shù)據(jù)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02關(guān)于Java中靜態(tài)代碼塊的執(zhí)行淺析
這篇文章主要給大家介紹了關(guān)于Java中靜態(tài)代碼塊執(zhí)行的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09java集合collection接口與子接口及實(shí)現(xiàn)類
這篇文章主要介紹了java集合collection接口與子接口及實(shí)現(xiàn)類,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-07-07Java經(jīng)典設(shè)計(jì)模式之策略模式原理與用法詳解
這篇文章主要介紹了Java經(jīng)典設(shè)計(jì)模式之策略模式,簡(jiǎn)單說(shuō)明了策略模式的概念、原理并結(jié)合實(shí)例形式分析了java策略模式的具有用法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-08-08Java基礎(chǔ)之面向?qū)ο髾C(jī)制(多態(tài)、繼承)底層實(shí)現(xiàn)
這篇文章主要介紹了Java基礎(chǔ)之面向?qū)ο髾C(jī)制(多態(tài)、繼承)底層實(shí)現(xiàn),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04Springboot Thymeleaf實(shí)現(xiàn)HTML屬性設(shè)置
這篇文章主要介紹了Springboot Thymeleaf實(shí)現(xiàn)HTML屬性設(shè)置,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2007-11-11