在番石榴中,是否可以方便地将Function<T, Boolean>
转换为Predicate<T>
?
在Functions
中,我可以看到Function<T, Boolean> forPredicate(Predicate<T> predicate)
,但我看不到任何其他方向。
我目前自己编写的代码是:
public static <T> Predicate<T> functionToPredicate(final Function<T, Boolean> func) {
return new Predicate<T>() {
@Override
public boolean apply(T input) {
return func.apply(input);
}
};
}
答案 0 :(得分:5)
将Function<A, Boolean>
转换为Predicate<A>
的问题是,后者可以返回true
或false
,前者也可以返回null
(当然,实际上会返回Boolean.TRUE
或Boolean.FALSE
)。
考虑到这一点,你建议的实现实际上可能会抛出一个NullPointerException
,如果函数恰好返回null
进行某些输入,这是你可以防范的,只需使用类型系统。
修改您的建议:
public static <T> Predicate<T> functionToPredicate(final Function<? super T, Boolean> function, boolean valueForNull) {
return new Predicate<T>() {
@Override
public boolean apply(T input) {
Boolean value = func.apply(input);
return (value != null) ? value.booleanValue() : valueForNull;
}
}
}
当然,您可以使用Predicates.compose:
Predicate<T> predicate = Predicates.compose(
Predicates.equalTo(Boolean.TRUE), function);
表示您希望将null
视为false
或
Predicate<T> predicate = Predicates.not(Predicates.compose(
Predicates.equalTo(Boolean.FALSE), function));
表示您希望将null
视为true
。