logging - 以简洁的方式在 java8 Predicate 中记录条件结果
问题描述
我有这样的代码:
Predicate<String> notNull = input -> (input != null);
Predicate<String> notEmpty = input -> (input.trim().length() > 0);
我的验证器方法使用它,如下所示:
public boolean isInputValid(String input){
return (notNull.and(notEmpty)).test(input);
}
每当我调用isInputValid(<myInputString>)
方法时,它都会返回真或假,但是,如果我想记录哪个条件完全失败,我怎么能在 Java8 中做到这一点而不将我的谓词 notNull 和 notEmpty 转换为方法。
下面将 Predicate notNull 转换为方法的示例将实现我使用输入记录问题的目标,但它过于冗长。有没有更好/更简洁的方法来做到这一点?
private Predicate<String> notNull(){
return input -> {
if(input == null){
log.warn("NULL input");
return false;
}
return true;
};
}
解决方案
一种方法是创建一个高阶函数,将一些日志记录代码包装在现有谓词周围,并返回一个可以用来代替原始谓词的谓词。以下是此类函数的示例:
static <T> Predicate<T> loggingPredicate(String label, Predicate<? super T> pred) {
return t -> {
boolean r = pred.test(t);
System.out.printf("%s: %s => %s%n", label, t, r);
return r;
};
}
这会打印出每个调用的输入和结果。它还带有一个标签,以便您可以从日志中判断正在评估哪个谓词。您可以对此进行调整,使其仅在谓词返回 false 或类似情况时打印日志消息。当然,您可以调整它以使用您喜欢的任何日志框架,而不是打印到标准输出。
然后,您可以使用现有的谓词并将它们包装在对该函数的调用中:
Predicate<String> notNull = loggingPredicate("notNull", input -> (input != null));
Predicate<String> notEmpty = loggingPredicate("notEmpty", input -> (input.trim().length() > 0));
然后像以前一样使用notNull
和notEmpty
。每次评估其中一个时,您都会收到一条日志消息。
推荐阅读
- regex - 查找和替换并获取替换内容值的计数
- amazon-web-services - s3文件存储图像问题
- javascript - JavaScript 刷新文件内容
- javascript - 无法在 Angular 5 npm 包中传递 @Input 变量(使用 ng-packagr 创建)
- r - 减去子列表并使用str_extract函数时如何使用lapply
- clean-architecture - 为什么控制器必须在 Clean Architecture 中的用例上调用接口
- javascript - Immutablity-helper - 如何更新这个值?
- json - 如何在 Symfony 4 中使用通过 Ajax 加载的表单将数据保存在数据库中?
- c# - 在 AutoMapper 中映射嵌套不同类型具有不同属性名称的嵌套对象
- maven - 如何使用 liberty-maven-plugin 在后台以调试模式启动 Liberty 服务器?