以简洁的方式记录java8谓词中的条件结果

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)

Stu*_*rks 7

一种方法是创建一个高阶函数,它将一些日志代码包装在现有谓词周围,并返回一个可用于代替原始谓词的谓词.以下是此类功能的示例:

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)

然后使用notNullnotEmpty之前一样.每次评估其中一个时,您都会收到一条日志消息.

  • 伟大的解决方案,将冗长度保持在最低限度并仍然完成工作 - 正是我所寻找的! (2认同)