@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 方法,計...