Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 功能性番石榴转换器<;T、 布尔值>;断言<;T>;_Java_Guava_Predicate - Fatal编程技术网

Java 功能性番石榴转换器<;T、 布尔值>;断言<;T>;

Java 功能性番石榴转换器<;T、 布尔值>;断言<;T>;,java,guava,predicate,Java,Guava,Predicate,在番石榴中,将函数转换为谓词是否方便 在函数中,我可以看到函数forPredicate(Predicate Predicate),但我看不到任何相反的方向 我目前必须自己编写的代码是: public static <T> Predicate<T> functionToPredicate(final Function<T, Boolean> func) { return new Predicate<T>() { @Overri

在番石榴中,将
函数
转换为
谓词
是否方便

函数
中,我可以看到
函数forPredicate(Predicate 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);
        }
    };
}
公共静态谓词函数topredicate(final Function func){
返回新谓词(){
@凌驾
公共布尔应用(T输入){
返回函数应用(输入);
}
};
}

函数
转换为
谓词
的问题在于后者可以返回
,前者也可以返回
(当然,实际上还返回
布尔值.true
布尔值.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;
    }
  }
}

对于您希望将
null
视为
true

的情况,我不知道,但您的方法看起来不错!假设Java8:
谓词p=func::apply您实际需要这种便利的频率是多少?你为什么不首先把你的
函数
写成一个
谓词
Predicate<T> predicate = Predicates.compose(
        Predicates.equalTo(Boolean.TRUE), function);
Predicate<T> predicate = Predicates.not(Predicates.compose(
        Predicates.equalTo(Boolean.FALSE), function));