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());