将匿名函数作为参数传递,构造匿名函数式接口实例

Summary::

// 不使用java.util.function.Predicate,而是使用了函数式编程编程思想  
// 使用java.util.function.Predicate可以更好的用JDK配套的函数式编程库,但这个例子说明不用类库也可以使用函数式编程思想  
public class FruitFilter {  
    /**  
     * 非常通用的过滤器,根据传来的列表类型和判断条件进行过滤  
     *  
     * @param list  
     * @param p  
     * @param <T>  
     * @return  
     */  
    public static <T> List<T> filter(List<T> list, Predicate<T> p) {  
        List<T> results = new ArrayList<>();  
        for (T t : list) {  
            if (p.test(t)) {  
                results.add(t);  
            }  
        }  
        return results;  
    }  
  
    public static void main(String[] args) {  
        List<Apple> inventory = Arrays.asList(new Apple(80, "green"),  
                new Apple(155, "green"),  
                new Apple(120, "red"));  
        // 使用匿名函数实现Predicate的test方法  
        List<Apple> greenApples = filter(inventory, (Apple a) -> "green".equals(a.getColor()));  
        System.out.println(greenApples);  
    }  
  
    // 只有一个方法的接口称为函数式接口,可以用@FunctionalInterface注解标记,不标记也可以  
    // 这种函数式接口可以在接口作为参数传递时,直接传递匿名函数,JDK会自动将匿名函数作为接口的实现,并构造该接口的匿名实例  
    @FunctionalInterface  
    public interface Predicate<T> {  
        boolean test(T t);  
    }  
}

参考文章

Java8实战第二章末尾