是否可以在java 8中添加日志记录到removeIf?

sum*_*mit 9 java collections java-8 java-stream

我使用的是Java 8.

以下代码工作正常:

public void testMethod(List<String> prop1, EmailJson randomModel) {
    prop1.stream().forEach(s -> randomModel.getSomeList()
            .removeIf(model -> model.getSomeProp().equalsIgnoreCase(s)));
}
Run Code Online (Sandbox Code Playgroud)

如果条件为真,是否可以记录消息?

我正在寻找类似的东西:

public void testMethod(List<String> prop1, EmailJson randomModel) {
    prop1.stream().forEach(s -> randomModel.getSomeList()
            .removeIf(model -> model.getSomeProp().equalsIgnoreCase(s))
                    - > if this is true then log some action);
}
Run Code Online (Sandbox Code Playgroud)

Era*_*ran 7

你总是可以替换

removeIf(model -> model.getSomeProp().equalsIgnoreCase(s))
Run Code Online (Sandbox Code Playgroud)

removeIf(model -> {
                    boolean ret = model.getSomeProp().equalsIgnoreCase(s);
                    if (ret) {
                        // add logging
                    }
                    return ret;
                  })
Run Code Online (Sandbox Code Playgroud)


Hol*_*ger 5

如果这是一个反复出现的问题,您可以创建一个辅助方法来概括用另一个操作来装饰谓词的任务,例如日志记录:

static <T> Predicate<T> logging(Predicate<T> p, BiConsumer<T,Boolean> log, boolean all) {
    return t -> {
        final boolean result = p.test(t);
        if(all || result) log.accept(t, result);
        return result;
    };
}
Run Code Online (Sandbox Code Playgroud)

您可以使用它

public void testMethod(List<String> prop1, EmailJson randomModel){
    prop1.forEach(s -> randomModel.getSomeList()
        .removeIf(logging(model -> model.getSomeProp().equalsIgnoreCase(s),
            (model,b) -> LOGGER.info(() -> "matched: "+model.getSomeProp()), false)));
}
Run Code Online (Sandbox Code Playgroud)

但是,在这种特定情况下,可能没有必要修饰谓词本身,因为removeIf返回boolean告知是否有要删除的匹配,并且匹配值仍在范围内:

public void testMethod(List<String> prop1, EmailJson randomModel){
    prop1.stream().forEach(s -> {
        if(randomModel.getSomeList()
                      .removeIf(model -> model.getSomeProp().equalsIgnoreCase(s)))
            LOGGER.info(() -> "there were matches of: "+s);
    });
}
Run Code Online (Sandbox Code Playgroud)