首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >以简明的方式在java8谓词中记录条件结果

以简明的方式在java8谓词中记录条件结果
EN

Stack Overflow用户
提问于 2018-06-21 01:24:49
回答 1查看 1.7K关注 0票数 3

我有一个这样的代码:

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;
    };
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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));

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50953859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档