函数<t,boolean =“”>的番石榴转换器到谓词<t> </t> </t,>

时间:2014-06-19 12:22:48

标签: java guava predicate

在番石榴中,是否可以方便地将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);
        }
    };
}

1 个答案:

答案 0 :(得分:5)

Function<A, Boolean>转换为Predicate<A>的问题是,后者可以返回truefalse,前者也可以返回null(当然,实际上会返回Boolean.TRUEBoolean.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