Jav*_*Tec 3 logging predicate java-8
我有这样的代码:
Predicate<String> notNull = input -> (input != null);
Predicate<String> notEmpty = input -> (input.trim().length() > 0);
Run Code Online (Sandbox Code Playgroud)
它由我的验证器方法使用,如下所示:
public boolean isInputValid(String input){
return (notNull.and(notEmpty)).test(input);
}
Run Code Online (Sandbox Code Playgroud)
每当我调用isInputValid(<myInputString>)
方法时,它会返回true或false,但是,如果我想记录哪个条件完全失败,我怎么能在Java8中这样做而不将我的Predicates notNull和notEmpty转换为方法.
下面将Predicate notNull转换为方法的示例将实现我使用输入记录问题的目标,但是它太冗长了.是否有更好/更简洁的方法来做到这一点?
private Predicate<String> notNull(){
return input -> {
if(input == null){
log.warn("NULL input");
return false;
}
return true;
};
}
Run Code Online (Sandbox Code Playgroud)
一种方法是创建一个高阶函数,它将一些日志代码包装在现有谓词周围,并返回一个可用于代替原始谓词的谓词.以下是此类功能的示例:
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;
};
}
Run Code Online (Sandbox Code Playgroud)
这将打印出每个调用的输入和结果.它还需要一个标签,以便您可以从日志中判断正在评估哪个谓词.你可以调整它,以便它只在谓词返回false时打印一条日志消息,或类似的东西.当然你可以调整它来使用你喜欢的任何日志框架而不是打印到stdout.
然后,您可以获取现有谓词并将其包装在对此函数的调用中:
Predicate<String> notNull = loggingPredicate("notNull", input -> (input != null));
Predicate<String> notEmpty = loggingPredicate("notEmpty", input -> (input.trim().length() > 0));
Run Code Online (Sandbox Code Playgroud)
然后使用notNull
和notEmpty
之前一样.每次评估其中一个时,您都会收到一条日志消息.
归档时间: |
|
查看次数: |
414 次 |
最近记录: |