Java中的Optional類詳細(xì)解讀
1 前言
Optional 是 Java 8 的新特性,專治空指針異常(NullPointerException, 簡(jiǎn)稱 NPE)問(wèn)題,它是一個(gè)容器類,里面只存儲(chǔ)一個(gè)元素(這點(diǎn)不同于 Conllection)。
為方便用戶通過(guò) Lambda 表達(dá)式調(diào)用 Optional 的方法,部分方法(如:filter、ifPresent、map、orElseGet)需傳入函數(shù)式接口
(如:Predicate、Consumer、Function、Supplier)參數(shù)。
2 主要屬性及構(gòu)造方法
類定義
Optional 類位于 java.util 包中,類定義如下:
//T 為元素?cái)?shù)據(jù)類型 public final class Optional<T>
主要屬性
//空容器 private static final Optional<?> EMPTY = new Optional<>(); //value 存儲(chǔ)容器內(nèi)唯一元素 private final T value;
構(gòu)造方法
//無(wú)參構(gòu)造方法:this.value = null private Optional() //有參構(gòu)造方法(value不允許為空):this.value = Objects.requireNonNull(value) private Optional(T value)
3 常用方法
創(chuàng)建容器(empty、of、ofNullable)
//創(chuàng)建空容器:return (Optional<T>) EMPTY public static<T> Optional<T> empty() //創(chuàng)建容器(value不允許為空):return new Optional<>(value) public static <T> Optional<T> of(T value) //創(chuàng)建容器(value允許為空):return value == null ? empty() : of(value) public static <T> Optional<T> ofNullable(T value)
容器判空(isPresent)
//判斷容器是否為空:return value != null
public boolean isPresent()
//判斷容器是否為空,若不為空,消費(fèi)元素
public void ifPresent(Consumer<? super T> consumer) {
if (value != null)
consumer.accept(value);
}應(yīng)用:
Optional<User> op = Optional.of(new User("張三", 20));
op.ifPresent(user -> System.out.println(user));
//op.ifPresent(System.out::println);獲取元素(get、orElse、orElseGet)
//獲取容器中唯一元素:return value
public T get()
//獲取容器唯一元素,若為空,返回指定值:return value != null ? value : other
public T orElse(T other)
//獲取容器唯一元素,若為空,返回供應(yīng)者(Supplier)提供的元素
public T orElseGet(Supplier<? extends T> other) {
return value != null ? value : other.get();
}應(yīng)用:
Optional<User> op = Optional.ofNullable(null);
User user = op.orElseGet(() -> new User("張三", 20));篩選元素(filter)
//過(guò)濾不符合斷言(Predicate)的元素
public Optional<T> filter(Predicate<? super T> predicate) {
Objects.requireNonNull(predicate);
if (!isPresent())
return this;
else
return predicate.test(value) ? this : empty();
}應(yīng)用:
Optional<User> op = Optional.of(new User("張三", 20));
Optional<User> op2 = op.filter(user -> user.age > 18);映射元素(map)
//將 T 類型元素映射為 U 類型元素
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));
}
}應(yīng)用:
Optional<String> op = Optional.of(new String("12345"));
Optional<Integer> op2 = op.map(str -> {
try {
return Integer.parseInt(str);
} catch (Exception e) {
return -1;
}
});到此這篇關(guān)于Java中的Optional類詳細(xì)解讀的文章就介紹到這了,更多相關(guān)Java的Optional類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
feign調(diào)用第三方接口,編碼定義GBK,響應(yīng)中文亂碼處理方式
這篇文章主要介紹了feign調(diào)用第三方接口,編碼定義GBK,響應(yīng)中文亂碼處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
Java實(shí)現(xiàn)簡(jiǎn)單的抽牌游戲
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單的抽牌游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04
spring通過(guò)導(dǎo)入jar包和配置xml文件啟動(dòng)的步驟詳解
這篇文章主要介紹了spring通過(guò)導(dǎo)入jar包和配置xml文件啟動(dòng),本文分步驟通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
IntelliJ IDEA進(jìn)行中文漢化的詳細(xì)教程(附圖文講解)
今天為大家?guī)?lái)的是 IntelliJ IDEA 中文漢化教程以及中文插件包下載教程,經(jīng)常收到小伙伴在后臺(tái)給我留言,問(wèn) IDEA 怎么進(jìn)行中文漢化,因?yàn)楹芏嘈』锇槭莿側(cè)腴T Java,看到 IDEA 菜單全英文有些不太適應(yīng),需要的朋友可以參考下2024-12-12
Java8新日期時(shí)間API的20個(gè)使用示例
這篇文章主要介紹了Java8新日期時(shí)間API的20個(gè)使用示例,為了學(xué)習(xí)Java 8的這個(gè)新庫(kù),這里我創(chuàng)建了20個(gè)以任務(wù)為導(dǎo)向的例子,需要的朋友可以參考下2015-03-03
SpringBoot和Vue2項(xiàng)目配置https協(xié)議過(guò)程
本文詳細(xì)介紹了SpringBoot項(xiàng)目和Vue2項(xiàng)目的部署流程及SSL證書(shū)配置,對(duì)于SpringBoot項(xiàng)目,需將.pfx文件放入resources目錄并配置server,然后打包部署,Vue2項(xiàng)目中,涉及檢查nginx的SSL模塊、編譯新的nginx文件2024-10-10

