哥哥做了佛 弟弟做了惡人,弟弟對哥哥說安心做你的佛 渡不了的人交給我!

0314154809.jpg
Lambda表達式
讓我們從最簡單的例子開始,來學(xué)習(xí)如何對一個string列表進行排序。我們首先使用Java 8之前的方法來實現(xiàn):
List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");
Collections.sort(names, new Comparator<String>() {
@Override
public int compare(String a, String b) {
return b.compareTo(a);
}
});
靜態(tài)工具方法Collections.sort接受一個list,和一個Comparator接口作為輸入?yún)?shù),Comparator的實現(xiàn)類可以對輸入的list中的元素進行比較。通常情況下,你可以直接用創(chuàng)建匿名Comparator對象,并把它作為參數(shù)傳遞給sort方法。
除了創(chuàng)建匿名對象以外,Java 8 還提供了一種更簡潔的方式,Lambda表達式。
Collections.sort(names, (String a, String b) -> {
return b.compareTo(a);
});
Optional
Optional是一個嚴(yán)重被低估的功能,并且有潛力刪除很多困擾我們的NullPointerExceptions。這在代碼邊界中(要么是正在使用的API,要么是正在暴露的API)特別有用,因為它允許你和你的調(diào)用代碼來推理所期待的東西。
我們就可以把下面這樣的代碼進行改寫。

oldways
不過,千萬不要改寫成這副樣子

newways
這樣改寫非但不簡潔,而且其操作還是和第一段代碼一樣。
無非就是用isPresent方法來替代u==null。這樣的改寫并不是Optional正確的用法,我們再來改寫一次。

was1
這樣才是正確使用Optional的姿勢。那么按照這種思路,我們可以安心的進行鏈?zhǔn)秸{(diào)用,而不是一層層判斷了??匆欢未a:
public static String getChampionName(Competition comp) throws IllegalArgumentException {
if (comp != null) {
CompResult result = comp.getResult();
if (result != null) {
User champion = result.getChampion();
if (champion != null) {
return champion.getName();
}
}
}
throw new IllegalArgumentException("The value of param comp isn't available.");
}
讓我們使用Optional,這些代碼會變成什么樣子。
public static String getChampionName(Competition comp) throws IllegalArgumentException {
return Optional.ofNullable(comp)
.map(c->c.getResult())
.map(r->r.getChampion())
.map(u->u.getName())
.orElseThrow(()->new IllegalArgumentException("The value of param comp isn't available."));
}