在流中记录日志

2022-09-04 05:28:28

我正在尝试将这段代码转换为Java 8流:

if (list != null && !list.isEmpty()) {
    Actor actor = null;
    for (Actor actor : list) {
        log.info("Actor being read: "  actor.getCode());
        List<String> areaList = areaDAO.getArea(actor.getCode());
        if (!areaList.isEmpty()) {
            actor.setArea(areaList.get(0));
            log.info("Area{" + areaList.get(0)
                 + "} is fetched for actor{" + actor.getCode() + "}.");
        }
        this.getContext().setReadCount(1);
    }
}

但是,在这种情况下,我不确定如何处理日志记录?这是一种好的做法吗?感谢您的帮助。谢谢


答案 1

通常,我们将日志记录放入代码中以支持调试。在这种情况下,我建议您看一下偷看方法。

这里有一个提示:

   List<Actor> actors = ...;

    actors.
        stream().
        peek(a -> System.out.println("Processing code: " + a.getCode())).
        forEach(a -> {/*Do something here*/});

来自 javadocs:

API 注意:此方法的存在主要是为了支持调试,您希望在元素流过管道中的某个点时查看元素:


答案 2

我认为在这种情况下使用forEach对您来说会很好吗?例:

list.stream().forEach(actor -> {
    log.info(String.format("Actor being read {%s}", actor));
    String actorCode = actor.getCode();
    areaDAO.getArea(actorCode).stream().findFirst().ifPresent(area -> {
       actor.setArea(area);
       log.info(String.format("Area {%s} is fetched for actor {%s}", area, actorCode));
    });
    getContext().setReadCount(1);
})

在某些情况下,您可能也想投入 - 例如对于getCode部分 - 以及?Objects.isNull()Optional.ofNullable


推荐