jdk1 8新特性之Optional

2022-05-12 17:33:39 字數 2712 閱讀 9739

@data

public class skuvo

@data

public class price

有乙個sku物件,裡面包含乙個skuid和乙個price物件,price物件裡面有市場價和成本價。假如現在有個需求,獲取sku裡面的mallprice,並且返回。

毫無疑問,npe相信每個程式設計師都不可能沒遇到過。jdk1.8以前一般是這麼寫:

private static bigdecimal fetchmallprice(skuvo skuvo) throws exception }}

}throw new exception("skuvo不符合要求,請檢查");

}

其實在真實專案中,這種寫法實在是太普遍了,各種非空判斷才敢往下執行,否則就會丟擲npe。但是這種寫法if巢狀得太多了,可讀性很差。

所以我們也可以像這樣,提前判斷是否為空,為空則拋異常:

private static bigdecimal fetchmallprice(skuvo skuvo) throws exception 

price price = skuvo.getprice();

if (price == null)

bigdecimal mallprice = price.getmallprice();

if (mallprice != null)

}throw new exception("skuvo不符合要求,請檢查");

}

雖然巢狀減少了,但是還是比較臃腫的。jdk1.8出來後,我們就可以優雅地寫這種功能了。

private static bigdecimal fetchmallprice(skuvo skuvo) throws exception
optional是jdk1.8出的新特性,其實思想挺簡單的,就是把實體包裝了一層,包裝的時候,如果是實體為空,則返回乙個空的optional,否則返回optional。

private optional(t value) 

private optional()

optional的構造方法都是private,所以其提供了三個靜態public方法來構造optional:

private static final optional<?> empty = new optional<>();

private final t value;

public staticoptionalempty()

public static optionalof(t value)

public static optionalofnullable(t value)

empty是當optional為空的時候返回的。

t是實際值。

empty()方法返回乙個空例項empty,即optional裡面不包含值,那麼我們使得 optional 只存在 包含值 和 不包含值 兩種狀態。

of(t value)方法將新建乙個非空的optional,如果value為空,那麼會丟擲npe。

ofnullable(t value)方法裡的value可以為空,如果為空,則呼叫empty()方法空的optional,否則呼叫of(t value)方法乙個非空的optional。

public void ifpresent(consumer<? super t> consumer) 

}

如果當前optional不為空,則呼叫consumer.accept(value)方法,而consumer又是函式式介面,故利用lambda表示式可以這樣寫:

optionalsku = optional.ofnullable(getsku());

sku.ifpresent(s -> system.out.println(s.getskuid()));

public t orelse(t other)
如果optional不為空,則返回,否則執行orelse傳入的引數。

public t orelseget(supplier<? extends t> other)
如果optional不為空,則返回,否則返回supplier實現類的值,supplier也是函式式介面,裡面只有get()方法。

public t orelsethrow(supplier<? extends x> exceptionsupplier) throws x  else 

}

同orelseget,只是但當optional為空的時候,會丟擲異常,丟擲的異常由傳入的異常exceptionsupplier提供。

if (!ispresent())

return empty();

else

}if (!ispresent())

return empty();

else

}

public optionalfilter(predicate<? super t> predicate)
filter方法接受乙個predicate來對optional包含的值進行過濾,如果包含的值滿足條件,那麼還是返回這個optional,否則返回empty()。

JDK1 8的新特性

jdk1.8之前的介面不可以有方法體,但從jdk1.8開始,介面中的方法可以帶有方法體為什麼要新增這個特性?介面就是為了定義乙個標準,這個標準要求所有的實現類實現這些抽象方法。但存在某些方法,所有的實現類 都是一樣的,索性就把這些 挪到介面中。使用的方法?通過default來修飾這個方法public...

JDK1 8新特性簡介

可以用static default來定義介面方法 用default來定義普通方法,這樣子類就不用強制覆寫這個方法了。用static來定義靜態方法 專給lanmda使用的介面加上annotation functionalinte ce 其中只能有乙個方法 使用 引數 程式執行語句 引數 簡單返回 引數...

JDK1 8 新特性(全)

hashmap資料結構 在jdk1.8中對hashmap等map集合的資料結構優化。hashmap資料結構的優化 知識點 1 原來的hashmap採用的資料結構是雜湊表 陣列 鍊錶 hashmap預設大小是16,乙個0 15索引的陣列,2 如何往裡面儲存元素 首先呼叫元素的hashcode 方法,計...