Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.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 “通用”;是空的;谓语_Java_Generics_Java 8_Predicate - Fatal编程技术网

Java “通用”;是空的;谓语

Java “通用”;是空的;谓语,java,generics,java-8,predicate,Java,Generics,Java 8,Predicate,我写了这个通用谓词: private static <T> Predicate<T> isNull(){ return Objects::isNull; } 有办法解决吗?谢谢 由于isNull()是泛型的,并且编译器在这样组合时无法推断泛型参数,因此需要显式指定类型参数 为此,您必须使用类名进行限定,例如Test: Test.<String>isNull().or(isEmpty()) Test.isNull()或(isEmpty()) 完整示

我写了这个通用谓词:

private static <T> Predicate<T> isNull(){
    return Objects::isNull;
}
有办法解决吗?谢谢

由于
isNull()
是泛型的,并且编译器在这样组合时无法推断泛型参数,因此需要显式指定类型参数

为此,您必须使用类名进行限定,例如
Test

Test.<String>isNull().or(isEmpty())
Test.isNull()或(isEmpty())
完整示例:

public class Test {
    public static void main(String[] args) {
        Predicate<String> isNullOrEmpty = Test.<String>isNull().or(isEmpty());
        System.out.println(isNullOrEmpty.test(null));   // true
        System.out.println(isNullOrEmpty.test(""));     // true
        System.out.println(isNullOrEmpty.test("Foo"));  // false
    }
    private static <T> Predicate<T> isNull(){
        return Objects::isNull;
    }
    private static Predicate<String> isEmpty(){
        return string -> string.isEmpty();
    }
}
公共类测试{
公共静态void main(字符串[]args){
谓词isNullOrEmpty=Test.isNull()或(isEmpty());
System.out.println(isNullOrEmpty.test(null));//true
System.out.println(isNullOrEmpty.test(“”);//true
System.out.println(isNullOrEmpty.test(“Foo”);//false
}
私有静态谓词isNull(){
返回对象::isNull;
}
私有静态谓词isEmpty(){
返回字符串->字符串.isEmpty();
}
}
还可以通过将每个零件指定给变量来解决此问题:

Predicate<String> isNull = isNull(); // String is inferred from assignment operator
Predicate<String> isEmpty = isEmpty();
Predicate<String> isNullOrEmpty = isNull.or(isEmpty);
谓词isNull=isNull();//字符串是从赋值运算符推断出来的
谓词isEmpty=isEmpty();
谓词isNullOrEmpty=isNull.or(isEmpty);
或者只是第一部分:

Predicate<String> isNull = isNull();
Predicate<String> isNullOrEmpty = isNull.or(isEmpty());
谓词isNull=isNull();
谓词isNullOrEmpty=isNull.or(isEmpty());
调用
isNull()
时,没有上下文可以推断
T
的实际类型


isNull().或(…)
这里需要一个
谓词专门用于
String
,您可能只需要一个
谓词,如下所示-

private static Predicate<String> isNullOrEmpty() {
    return s -> s == null || s.isEmpty();
}

在我们的项目中,我们有一个小的解决方案:

private static <T> Predicate<T> allOr(Predicate<T> ... predicates) {
    return Arrays.stream(predicates).reduce(Predicate::or).orElse(x -> true);
}
私有静态谓词allOr(谓词…谓词){
返回Arrays.stream(谓词).reduce(谓词::或).orElse(x->true);
}
并将其用于:

Predicate<String> both = allOr(isEmpty(), isNull());
Predicate-both=allOr(isEmpty(),isNull());

这应该有效-
.isNull()或(isEmpty())
@JBNizet IMHO,问题已经解决了,
isNull()或(isEmpty())
的使用不会与OP共享的实用程序一起编译。翻转它们不等于调用
str.isEmpty()| str==null
?如果
str
null
@Slaw-oh-ya,则第一部分将抛出
NullPointerException
。你是对的。@Slaw我已经更新了答案(说它在这种情况下不起作用)。但是我决定保持原样——看看翻转是如何工作的(撇开每个谓词正在做什么的当前上下文不谈)可能会很有用。它将自动选择所有谓词共用的
T
不过,如果(predicates.length==0)抛出新的IllegalArgumentException(),我会添加
,而不是默认为
true
值,特别是因为我希望默认值为
false
,即在谓词列表中模拟一个伪
()->false
。@Andreas oh我们在内部审查中对此进行的辩论也是…)我同意你的观点,但显然不是我团队的所有成员do@Andreas好的,
()->false
谓词::的默认值,或者像
()->true一样的
谓词::和
,因此对于空谓词列表,默认值也是可取的。或者,您可以使用
allOr(Predicate first,Predicate…more)
@Holger强制执行至少一个参数。这确实是正确的,我将为我们的代码打开一个内部问题:(为什么我没有指定
Predicate first,Predicate…allochers
…谢谢!)!!
private static Predicate<String> isNullOrEmpty() {
    return s -> s == null || s.isEmpty();
}
List<String> strings = Arrays.asList("", "one", "two", null, "three");
strings.stream().filter(isNullOrEmpty()).forEach(System.out::println);
// ofcourse the above would print "null" and is less useful
List<String> strings = Arrays.asList("", "one", "two", null, "three");
strings.stream().filter(Predicate.not(isNullOrEmpty)).forEach(System.out::println); 
// this would print one, two and three
private static <T> Predicate<T> allOr(Predicate<T> ... predicates) {
    return Arrays.stream(predicates).reduce(Predicate::or).orElse(x -> true);
}
Predicate<String> both = allOr(isEmpty(), isNull());