我有一个这样的代码:
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>)
方法时,它都会返回true或false,然而,如果我想记录到底哪个条件失败了,我如何在Java8中做到这一点而不把我的谓词notNull和notEmpty转换成方法。
下面将谓词notNull转换为方法的示例将实现我的目标,即使用输入记录问题,但它太冗长了。有没有更好/更简洁的方法呢?
private Predicate<String> notNull(){
return input -> {
if(input == null){
log.warn("NULL input");
return false;
}
return true;
};
}
发布于 2018-06-21 05:35:13
一种方法是创建一个高阶函数,该函数将一些日志记录代码包装在现有谓词周围,并返回一个可以用来代替原始谓词的谓词。下面是这样一个函数的示例:
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或类似的情况时打印日志消息。当然,您可以对其进行调整,以使用您喜欢的任何日志记录框架,而不是打印到stdout。
然后,您可以获取现有的谓词,并将它们包装在对此函数的调用中:
Predicate<String> notNull = loggingPredicate("notNull", input -> (input != null));
Predicate<String> notEmpty = loggingPredicate("notEmpty", input -> (input.trim().length() > 0));
然后像以前一样使用notNull
和notEmpty
。每次对其中一个进行评估时,您都会收到一条日志消息。
https://stackoverflow.com/questions/50953859
复制相似问题