java - 通用“为空”谓词
问题描述
我写了这个通用谓词:
private static <T> Predicate<T> isNull(){
return Objects::isNull;
}
但我不能将它与像这样的其他谓词结合使用:
private static Predicate<String> isEmpty(){
return string -> string.isEmpty();
}
因为这个片段不会编译(期望 Predicate<String> 在 or 操作):
isNull().or(isEmpty())
有什么办法解决吗?谢谢!
解决方案
由于isNull()
是泛型的,并且编译器无法在这样组合时推断出泛型参数,因此您需要显式指定类型参数。
为此,您必须使用类名进行限定,例如Test
:
Test.<String>isNull().or(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();
}
}
您还可以通过将每个部分分配给一个变量来解决它:
Predicate<String> isNull = isNull(); // String is inferred from assignment operator
Predicate<String> isEmpty = isEmpty();
Predicate<String> isNullOrEmpty = isNull.or(isEmpty);
或者只是第一部分:
Predicate<String> isNull = isNull();
Predicate<String> isNullOrEmpty = isNull.or(isEmpty());
推荐阅读
- git - 由于默认设置,从 VSCode Remote-Container 到 AWS CodeCommit 存储库的连接失败
- c# - AutoRespond to Yes No dialogs in c# like try catch for errors
- swift - 为什么将函数类型转换为 AnyObject 有效
- r - R:如何在函数本地环境中保存所有对象?
- swift - 如何使用 UIDraginInteraction 开始拖动 UIImage?
- sql-server - 多行文件的 SSIS 表达式构建器(执行流程任务)
- karate - 空手道 API - 带有模糊匹配 #number 的断言
- kubernetes - istio 因“检查应用程序端口失败”而失败
- mysql - 如何将这 3 个不同的查询合并为一个?
- node.js - 使用 express-fileUpload 上传文件错误