【问题标题】:Adding a log when encounter null object in parallel stream在并行流中遇到空对象时添加日志
【发布时间】:2019-01-01 12:06:56
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 但我首先要想知道这个日志有什么用......

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


【解决方案1】:

使用.filter(Objects::nonNull),您将过滤掉所有null 元素,只保留非空元素,这意味着在forEach 中,您将不会收到任何空元素,更不用说记录它了。相反,你想要:

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

【讨论】:

    【解决方案2】:

    过滤null项目后你找不到它们!

    只需使用这个:

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

    【讨论】:

      【解决方案3】:

      你可以使用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);
      

      【讨论】:

      • 缺点是检查发生了两次
      • @Eugene 是的,但日志记录可能比检查时间长至少一两个数量级。
      • @DavidConrad 当然......我只是说,我什至赞成
      • @Eugene 明白了。这是 OP 应该注意的警告。
      • 现在是重新考虑null 是否应该是有效元素的时候了。如果有效,则无需记录null 的出现。如果没有,最好使用.map(Objects::requireNonNull) 并让它立即失败并修复源代码,如果发生的话。
      猜你喜欢
      • 2015-10-25
      • 2015-07-20
      • 2014-03-23
      • 1970-01-01
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      • 2021-08-06
      • 2023-03-12
      相关资源
      最近更新 更多