首页 > 解决方案 > 以简洁的方式在 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;
    };
}

标签: loggingjava-8predicate

解决方案


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

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));

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


推荐阅读