在Java 8中,Comparator
类使用Function
的结果Comparator
将Function
组成Comparator
Function
输入Predicate
。
我想做的是,能够将Set<Person>
个对象与Person
等其他类型组合在一起,以使我的代码更具可读性,并使我的功能操作更强大。< / p>
例如,假设public String getName()
Person
有people.removeIf(Predicates.andThenTest(Person::getName, String::isEmpty));
方法。我希望能够过滤掉没有名字的Function
个对象。理想情况下,语法如下所示:
Predicate
是否有任何内置方法可以使用Predicate
组成extend Function<T, Boolean>
?我知道really nifty static method但是这对于将函数与其他函数组合起来很有用,遗憾的是,p -> p.getName().isEmpty()
并不是Predicate
。
P.S。我也知道我可以使用像Function
这样的lambda,但我希望能够用<input class="contentLink" type="button" value="Questionnaire" onclick="validate(<?php urlencode('/my-site/Tools/Learning_Strategies/Questionnaire.php'); ?>)"/>
组合预先存在的<input class="contentLink" type="button" value="Questionnaire" onclick="validate()"/>
个对象。
答案 0 :(得分:0)
您可以像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);
答案 1 :(得分:0)
对于内置于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;