有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

函数<T,布尔>到谓词<T>

在番石榴中,将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) 个答案

  1. # 1 楼答案

    Function<A, Boolean>转换为Predicate<A>的问题在于,后者可以返回truefalse,前者也可以返回null(当然,实际上返回Boolean.TRUEBoolean.FALSE

    考虑到这一点,如果函数恰好为某些输入返回null,那么建议的实现实际上可能会抛出一个NullPointerException,这不是简单使用类型系统可以避免的

    修改您的建议:

    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的情况