在并行流中遇到空对象时添加日志

时间:2018-07-24 19:05:18

标签: java filter java-8 stream java-stream

不确定lambda表达式和排序的新语法。

            itemStream.parallel().filter(Objects::nonNull).forEach( 
                (item) -> randomMethod(item));

我之前在for循环中所执行的操作是先检查null,然后如果遇到null项目,则发出警告

                    log.warn("Skipping a null item!");

使用基于流的方法如何记录它遇到空对象(同时仍在过滤)的情况?

3 个答案:

答案 0 :(得分:7)

您可以使用Stream::peek

itemStream.parallel()
    .peek(item -> { if (item == null) log.warn("Skipping a null item!"); })
    .filter(Objects::nonNull)
    .forEach(item -> randomMethod(item));

您还可以对randomMethod使用方法引用(这里我假设它是this的成员):

itemStream.parallel()
    .peek(item -> { if (item == null) log.warn("Skipping a null item!"); })
    .filter(Objects::nonNull)
    .forEach(this::randomMethod);

答案 1 :(得分:1)

使用.filter(Objects::nonNull),您将过滤掉所有null元素,并且仅保留非null元素,这意味着在forEach中,您将不会收到任何null元素,不必担心日志记录它。相反,您想要:

itemStream.parallel()
          .forEach(item -> { 
               if(Objects.isNull(item)) { ... } else { ... }; // or if(item == null) ...
          });

答案 2 :(得分:1)

过滤null个项目后,您将找不到它们!

只需使用此:

itemStream.parallel().forEach((item)-> {
    if(item==null)
       log.warn("Skipping a null item!");
    else
       randomMethod(item)
});