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