【问题标题】:Java use void method for stream mapping?Java使用void方法进行流映射?
【发布时间】:2017-01-18 12:51:10
【问题描述】:

假设我有一个 void 方法,它只对对象进行转换,不返回任何值,我想在流 map() 函数的上下文中使用它,如下所示:

public List<MyObject> getList(){
    List<MyObject> objList = ...
    return objList.stream().map(e -> transform(e, e.getUuid())).collect(Collectors.toList());
}

private void transform(MyObject obj, String value){
    obj.setUuid("prefix" + value);
}

这个例子是为了简单起见——实际的方法是做一些别的事情,而不仅仅是弄乱对象的 UUID。

无论如何,在上述情况下如何使用 void 方法? 当然,我可以让方法返回转换后的对象,但这不是重点,违反了设计(方法应该是无效的)。

【问题讨论】:

    标签: java java-8 java-stream


    【解决方案1】:

    似乎这是强制使用 java 8 流的情况。相反,您可以使用 forEach 来实现它。

    List<MyObject> objList = ...
    objList.forEach(e -> transform(e, e.getUuid()));
    return objList;
    

    【讨论】:

      【解决方案2】:

      除了Eugene's answer,您还可以像这样使用Stream::map

      objList.stream()
         .map(e -> {
            transform(e, e.getUuid()); 
            return e;
         }).collect(Collectors.toList());
      

      实际上,您并不想转换当前元素并将其收集到新的List 中。

      相反,您想为List 中的每个条目应用一个方法。

      因此您应该使用Collection::forEach 并返回List

      List<MyObject> objList = ...;
      objList.forEach(e -> transform(e, e.getUuid()));
      return objList;
      

      【讨论】:

        【解决方案3】:

        如果您确定这是您想要做的,请使用 peek 而不是 map

        【讨论】:

        【解决方案4】:

        您可以使用peek(Consumer&lt;? super T&gt; action) 方法。它将消费者作为参数,对每个元素执行操作并返回一个流。

        objList.stream().peek(e -> transform(e,e.getUuid())).collect(Collectors.toList());
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-11-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-13
          • 1970-01-01
          • 2012-04-13
          相关资源
          最近更新 更多