JDK1.8的幾個新特性
通常按照以前我們可能會這麽寫:
long count = 0;
for (Person p : persons) {
if (p.getAge() > 20) {
count ++;
}
}
但如果使用 stream 的話,則會簡單很多:
long count = persons.stream()
.filter(person -> person.getAge() > 20)
.count();
這只是 stream 的很簡單的一個用法。現在鏈式調用方法算是一個主流,這樣寫也更利於閱讀和理解編寫者的意圖,一步方法做一件事。
場景二:最大值、最小值
max和min
Stream 上常用的操作之一是求最大值和最小值。Stream API 中的 max 和 min 操作足以解決這一問題。
List<Integer> list = Lists.newArrayList(3, 5, 2, 9, 1);
int maxInt = list.stream()
.max(Integer::compareTo)
.get();
int minInt = list.stream()
.min(Integer::compareTo)
.get();
assertEquals(maxInt, 9);
assertEquals(minInt, 1);
這裏有 2 個要點需要註意:
max 和 min 方法返回的是一個 Optional 對象(對了,和 Google Guava 裏的 Optional 對象是一樣的)。Optional 對象封裝的就是實際的值,可能為空,所以保險起見,可以先用 isPresent() 方法判斷一下。Optional 的引入就是為了解決方法返回 null 的問題。
Integer::compareTo 也是屬於 Java 8 引入的新特性,叫做 方法引用(Method References)。在這邊,其實就是 (int1, int2) -> int1.compareTo(int2) 的簡寫,可以自己查閱了解,這裏不再多做贅述。
JDK1.8的幾個新特性