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

SS'*_*SS' 2 java stream filter java-8 java-stream

不确定这里的语法,lambda表达式和排序的新功能.

            itemStream.parallel().filter(Objects::nonNull).forEach( 
                (item) -> randomMethod(item));
Run Code Online (Sandbox Code Playgroud)

我之前在for循环中所做的是检查null,然后在遇到null项时发出警告

                    log.warn("Skipping a null item!");
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*rad 7

你可以使用Stream::peek:

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

你也可以使用方法参考randomMethod(这里我假设它是一个成员this):

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

  • @Eugene True,但是日志记录可能比检查时间长至少一个或两个数量级. (3认同)
  • 缺点是检查发生两次 (2认同)
  • @DavidConrad当然......我只是说,我甚至投了赞成票 (2认同)