将匿名函数作为参数传递,构造匿名函数式接口实例
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实战第二章末尾