【问题标题】:Java lambda expression -- mapping and then modifying a list?Java lambda 表达式——映射然后修改列表?
【发布时间】:2015-11-06 00:14:20
【问题描述】:

使用 Java 8 lambda 表达式,我正在尝试做这样的事情。

List<NewObject> objs = ...;
for (OldObject oldObj : oldObjects) {
  NewObject obj = oldObj.toNewObject();
  obj.setOrange(true);
  objs.add(obj);
}

我写了这段代码。

oldObjects.stream()
  .map(old -> old.toNewObject())
  .forEach({new.setOrange("true")})
  .collect(Collectors.toList()); 

这是无效代码,因为我随后尝试对 .forEach() 返回的内容执行 .collect(),但 forEach 无效且不返回列表。

这应该如何构建?

【问题讨论】:

    标签: java lambda java-8 java-stream


    【解决方案1】:

    您可以使用Stream's peek method,它返回Stream,因为它是一个中间操作。它通常不应该有副作用(它应该是“无干扰的”),但在这种情况下,我认为副作用 (setOrange(true)) 是有意的并且很好。

    List<NewObject> newObjects =
        oldObjects.stream()
            .map(OldObject::toNewObject)
            .peek( n -> n.setOrange(true))
            .collect(Collectors.toList());
    

    它与您的非流代码一样冗长,因此您可以选择使用哪种技术。

    【讨论】:

    • 无副作用和无干扰之间是有区别的。 (请注意,返回 void 的 lambda 有副作用,除了微不足道的 e -&gt; {} 消费者。)确定传递给 peek 的 lambda 实际上是不干扰的并不总是微不足道的(虽然你在这里得到的看起来足够无害。)
    • 它不会比peek( n -&gt; print(n) )更干扰
    • @bayou.io:这是不正确的。改变流元素的属性可能会产生干扰,例如如果同一个元素在同一个流中出现多次。这与print 操作不同。但是由于oldObj.toNewObject() 似乎创建了新实例,我们可以得出结论,这里不是这种情况。但是,构造NewObject 实例并在map 操作中的一个lambda 中设置orange 属性仍然会更简洁。那么,peek 就没有必要了。
    【解决方案2】:

    您可以使用peek

    List<NewObject> list = oldObjects.stream()
                                     .map(OldObject::toNewObject)
                                     .peek(o -> o.setOrange(true))
                                     .collect(Collectors.toList());
    

    或者,您可以在形成列表后改变元素。

    List<NewObject> list = oldObjects.stream()
                                     .map(OldObject::toNewObject)
                                     .collect(Collectors.toList());
    list.forEach(o -> o.setOrange(true));
    

    【讨论】:

      猜你喜欢
      • 2015-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-07
      相关资源
      最近更新 更多