谓词Predicate
谓词(即一个返回boolean值的函数)
java8 中允许接收一个函数,并返回一个函数。接收一个函数很好理解:
filter(list, (Apple a) -> a.getWeight() > 150)
方法filter接受了一个表达式,
(Apple a) -> a.getWeight() > 150
他就相当于public static boolean a(Apple a) {return a.getWeight() > 150;}
那如何理解返回一个函数,在java源码中我们可以找到案例
default Predicate<T> and(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) && other.test(t);
}
java8规定了
接口如今可以包含实现类没有提供实现的方法签名,缺失的方法主体随接口提供了(因此就有了默认实现),而不是由实现类提供
简单来讲,就是java8为了给接口扩展函数,但是又希望实现了接口的实体类受到破坏,所以定义了新的规则(此处会引发菱形继承问题,如发生必须显式重写)上面的方法来自java8的Predicate接口,可以看到返回值为 (t) -> test(t) && other.test(t)
该返回值返回的不是boolean, 而是
(t) -> { return true|false; }
,相当于return (t) -> {return test(t) && other.test(t);};
表示返回一个functional interface, 这个functional interface是什么根据上下文确定, 只要是接受参数是1个并且返回值是bool都可以, 在Predicate中就是functional interface自己, 因为方法规定了返回值是Predicate