在Java8中,Comparator类有这个真正精妙的静态方法,它通过使用Function的结果作为Comparator的输入,将Function组合成Comparator。
我想要做的是,能够将Function对象与其他类型(如Predicate )组合在一起,以便使代码更加可读性,并使我的功能操作更加强大。
例如,假设有一个Set<Person>,其中Person有一个public String getName()方法。我希望能够过滤掉没有名称的Person对象。理想情况下,语法应该如下所示:
people.removeIf(Predicates.andThenTest(Person::getName, String::isEmpty));是否有任何内置方法可以用类似于Function的Predicate__组成一个__?我知道Function#andThen(Function),但这仅适用于将函数与其他函数组合在一起,遗憾的是,Predicate没有extend Function<T, Boolean>。
我也知道我可以使用像p -> p.getName().isEmpty()这样的lambda,但是我想要一种用Function来组合预先存在的Predicate对象的方法。
发布于 2016-07-11 15:54:26
Java 8中没有内置谓词的值提取器方法,但下一个最佳解决方案是自己实现它:
public class Predicates {
public static <T,R> Predicate<T> andThenTest(
Function<T,R> func, Predicate<R> pred) {
return t -> pred.test(func.apply(t));
}
}由于@Holger,这也可能是:
return func.andThen(pred::test)::apply;发布于 2016-07-11 14:33:02
您可以将Predicate转换为如下所示的Function:
Predicate<String> p = String::isEmpty;
Function<String, Boolean> g = p::test; // predicate to function
Function<Boolean, String> f = Object::toString;
f.compose(g); // or g.andThen(f);https://stackoverflow.com/questions/38270384
复制相似问题