使用Java Stream API更新POJO列表

时间:2019-07-17 14:35:15

标签: java collections java-8 java-stream

我有以下POJO:

public class Order {
  private String name;
  private String status;
  private BigDecimal total;

  // getters, setters and ctors down here

}

我正在遍历List<Order>,并尝试将其所有status字段更新为值"ORDERED" old (预流式API)的实现方式是:

for (Order order : orders) {
  order.setStatus("ORDERED");
}

我正在尝试找出完成同一件事的Java 8(“流”)方式。迄今为止我最大的尝试:

orders.stream().map(order -> order.setStatus("H"));

产生编译器错误:

  

不兼容的类型。必需列表,但将'map'推断为Stream:不存在类型变量R的实例,因此Stream符合List

有什么想法我要去哪里吗?

2 个答案:

答案 0 :(得分:3)

使用forEach

orders.forEach(order -> order.setStatus("H"));

答案 1 :(得分:0)

您不想使用Stream.map(),因为它需要一个返回值来替换流中的原始值。您还丢失了流中的终端操作,因此即使您通过返回原始值对其进行了修复,也无法正常工作。 Stream.forEach()是可以用于此操作的终端操作。

要更新列表中的每个对象,您只需使用orders.forEach()。这与orders.stream().forEach()相同。

orders.forEach(o -> o.setStatus("H"));

如果您只想更新列表的某些值,则可以在之前使用Stream.filter()

orders.stream()
        .filter(o -> "ABC".equals(o.getName())
        .forEach(o -> o.setStatus("H"));