使用Java流API更新POJO列表
我有以下几点建议:使用Java流API更新POJO列表,java,collections,java-8,java-stream,Java,Collections,Java 8,Java Stream,我有以下几点建议: public class Order { private String name; private String status; private BigDecimal total; // getters, setters and ctors down here } 我正在循环浏览一个列表,并尝试将其所有状态字段更新为“有序的”。旧的(预流式API)方法是: for (Order order : orders) { order.setStatus("O
public class Order {
private String name;
private String status;
private BigDecimal total;
// getters, setters and ctors down here
}
我正在循环浏览一个列表
,并尝试将其所有状态
字段更新为“有序的”
。旧的(预流式API)方法是:
for (Order order : orders) {
order.setStatus("ORDERED");
}
我正试图找出Java8(“流”)实现同样事情的方法。我迄今为止最好的尝试是:
orders.stream().map(order -> order.setStatus("H"));
生成编译器错误:
“不兼容的类型。需要列表,但已将“映射”推断为流:不存在类型变量R的实例,因此流符合列表”
我有什么想法吗?使用
forEach
:
orders.forEach(order -> order.setStatus("H"));
您不想使用
Stream.map()
,因为它需要一个返回值来替换流中的原始值。您的流中还缺少一个终端操作,因此即使您通过返回原始值来修复它,它也不会工作Stream.forEach()
是一种终端操作,可用于此操作
要更新列表中的每个对象,只需使用orders.forEach()
。这与orders.stream().forEach()相同
如果只想更新列表中的某些值,可以在以下操作之前使用Stream.filter()
:
orders.stream()
.filter(o -> "ABC".equals(o.getName())
.forEach(o -> o.setStatus("H"));
流式传输集合时,不要使用流来更改对象。您希望对每个元素执行一个操作,那么是什么促使您决定尝试
map
,而不是其中一个,例如forEach
?
orders.stream()
.filter(o -> "ABC".equals(o.getName())
.forEach(o -> o.setStatus("H"));