Lambda能夠使表達更加簡潔,jdk8以前要想向方法傳入一個函數邏輯,不得不去實現一個接口,jdk8帶來的Lambda表達式能夠將函數做爲參數直接傳入方法內(至少看起來是這樣)。數組
提及Lambda在jdk8中強大,就不得不提jdk8帶來的Stream API,Stream API分爲中間操做和終端操做,函數
經常使用的中間操做包括:filter(過濾), map(映射,好比將某個對象映射爲其惟一ID), distinct(使用equals去重), sorted(使用Comparator排序), skip(跳過n個), limit(限制最大個數n)spa
經常使用的終端操做包括:code
1 @FunctionalInterface 2 public interface Comparator<T> { 3 int compare(T o1, T o2); 4 boolean equals(Object obj); 5 //other methods ... 6 }
Comparator就是一個函數接口,所謂函數是指只有一個有效抽象方法的接口,這裏的有效抽象方法不包括Object中的方法,任何一個只有一個有效抽象方法的接口均可以做爲函數接口使用,即使沒有被@FunctionalInterface註解。對象
函數接口是如何工做的呢?blog
1 List<String> list = new ArrayList<>(); 2 //add elements ... 3 list.stream().filter(p -> p.length() > 3);
filter的入參是一個Predicate函數接口,該函數接口有一個抽象方法test,能夠將filter(Predicate predicate)當作是以下處理排序
1 Stream<T> filter(Predicate<? super T> predicate){ 2 for (each string in stream){ 3 if(predicate.test(string)){ 4 keep the string 5 }else{ 6 drop the string 7 } 8 9 return stream; 10 }