Java8 新增了 Optional 類,可以更加優雅地解決空指針的問題。 構造器 Optional 的構造器是私有的,不能通過 new 的方式來創建 Optional 對象,因此,Optional 提供了三個靜態方法創建 Optional 對象,分別為 /`of(T value) ofNullab ...
Java8 新增了 Optional 類,可以更加優雅地解決空指針的問題。
構造器
Optional 的構造器是私有的,不能通過 new 的方式來創建 Optional 對象,因此,Optional 提供了三個靜態方法創建 Optional 對象,分別為empty()
/of(T value)
/ofNullable(T value)
。
empty()
使用單例模式,直接返回靜態常量EMPTY
;of(T value)
的值為空時,會拋出空指針異常,而ofNullable(T value)
允許值為空。
// 輸出:Optional.empty
System.out.println(Optional.empty());
// 輸出:Optional[hello]
System.out.println(Optional.of("hello"));
// 輸出:NullPointerException
System.out.println(Optional.of(null));
// 輸出:Optional[hello]
System.out.println(Optional.ofNullable("hello"));
// 輸出:Optional.empty
System.out.println(Optional.ofNullable(null));
常用方法
get
使用 get 方法可以獲取 Optional 的 value 值,如果value==null
,會拋出 NoSuchElementException。
// 輸出:hello
System.out.println(Optional.ofNullable("hello").get());
// 輸出:NoSuchElementException
System.out.println(Optional.ofNullable(null).get());
orElse/orElseGet/orElseThrow
orElse(T other)
表示如果value==null
,則返回為other
。
orElseGet(Supplier<? extends T> other)
表示如果value==null
,則執行函數other
。
orElseThrow(Supplier<? extends X> exceptionSupplier)
表示如果value==null
,則執行異常函數other
。
// 輸出:hello
System.out.println(Optional.ofNullable(hello).orElse("hei"));
// 輸出:hei
System.out.println(Optional.ofNullable(null).orElse("hei"));
// 輸出:hei
System.out.println(Optional.ofNullable(null).orElseGet(() -> "hei"));
// 輸出:RuntimeException: eeeee...
System.out.println(Optional.ofNullable(null).orElseThrow(() -> new RuntimeException("eeeee...")));
ifPresent
ifPresent(Consumer<? super T> consumer)
表示如果value!=null
,則執行指定函數consumer
。
// 輸出:hello
Optional.of(hello).ifPresent(System.out::println);
filter
filter(Predicate<? super T> predicate)
是類似過濾器的作用,即如果 value 不滿足函數predicate
的要求,則返回EMPTY
;否則返回 Optional 的 value 值。
// 輸出:Optional[hello]
System.out.println(Optional.of(hello).filter(f -> hello.equals("hello")));
map/flatMap
map(Function<? super T, ? extends U> mapper)
和flatMap(Function<? super T, Optional<U>> mapper)
類似,用 mapper 函數對 value 值進行處理,並返回處理後的結果。區別是 flatMap 的函數 mapper 泛型為Optional<U>
。
// 輸出:Optional[hello dd]
System.out.println(Optional.of(hello).map(m -> hello + " dd"));
// 輸出:Optional[hello dd]
System.out.println(Optional.of(hello).flatMap(f -> Optional.of("").map(m -> hello + " dd")));