Java 8 修改流元素

新手上路,请多包涵

我想用 Java 8 编写纯函数,它将一个集合作为参数,对该集合的每个对象应用一些更改,并在更新后返回一个新集合。我想遵循 FP 原则,所以我不想更新/修改作为参数传递的集合。

有没有什么方法可以使用 Stream API 而无需先创建原始集合的副本(然后使用 forEach 或“正常”for 循环)?

下面的示例对象并假设我想将文本附加到对象属性之一:

 public class SampleDTO {
    private String text;
}

所以我想做类似于下面的事情,但不修改集合。假设“列表”是 List<SampleDTO>

 list.forEach(s -> {
    s.setText(s.getText()+"xxx");
});

原文由 Zyga 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 446
2 个回答

您必须有一些方法/构造函数来生成现有 SampleDTO 实例的副本,例如复制构造函数。

Then you can map each original SampleDTO instance to a new SampleDTO instance, and collect them into a new List

 List<SampleDTO> output =
    list.stream()
        .map(s-> {
                     SampleDTO n = new SampleDTO(s); // create new instance
                     n.setText(n.getText()+"xxx"); // mutate its state
                     return n; // return mutated instance
                 })
       .collect(Collectors.toList());

原文由 Eran 发布,翻译遵循 CC BY-SA 3.0 许可协议

为了使这种方式更优雅,我建议在课堂上创建一个 Method

  public class SampleDTO {
 private String text;
public String getText() {
    return text;
}

public void setText(String text) {
    this.text = text;
}

public SampleDTO(String text) {
    this.text = text;
}

public SampleDTO getSampleDTO() {
    this.setText(getText()+"xxx");
    return this;
}
    }

并添加如下:

 List<SampleDTO> output =list.stream().map(SampleDTO::getSampleDTO).collect(Collectors.toList();

原文由 soorapadman 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏