没有内置的工厂方法,您可以通过查看JFC中的所有用法
Predicate并查找“ …中返回谓词的方法”
来轻松检查。除了
Predicate自身内部的方法外,只有
Pattern.asPredicate()可以返回
Predicate。
在实现这种工厂方法之前,应该问自己是否真的值得。使您的lambda表达式
.filter(a -> Objects.equals(a.getField(),somevalue))看起来复杂的原因是,
Objects.equals当您可以预测至少一个参数是否为时,就不必使用它
null。由于在这里
somevalue是never
null,因此可以简化表达式:
final Integer somevalue = 42;Stream.of(new A(42), new A(1729), new A(42), new A(87539319), new A(null)) .filter(a -> somevalue.equals(a.getField())) …
如果您仍想实现工厂方法并利用已有的方法创造性地赢得价格,则可以使用:
public static <T,R> Predicate<T> isEqual(Function<? super T, ? extends R> f, R value) { return f.andThen(Predicate.isEqual(value)::test)::apply;}但是,对于生产代码,我宁愿推荐这样的实现:
public static <T,R> Predicate<T> isEqual(Function<? super T, ? extends R> f, R value) { return value==null? t -> f.apply(t)==null: t -> value.equals(f.apply(t));}这将测试排除在外,该常数是否是
null为了简化将在每个测试中执行的操作。因此它仍然不需要
Objects.equals。请注意,
Predicate.isEqual它的作用类似。



