我有一段看起来像这样的代码。
我读过两个矛盾的(?)"规则"对此。
.map
不应该有副作用.foreach
不应该
更新一个可变变量(所以如果我重构使用foreach和
填充结果列表,然后打破那个)http://files.zeroturnaround.com/pdf/zt_java8_streams_cheat_sheet.pdf 我如何解决它,以便我使用流并仍然返回一个列表,或者我应该只是跳过流?
@Transactional
public Collection<Thing> save(Collection<Thing> things) {
return things.stream().map(this::save).collect(Collectors.toList());
}
@Transactional
public Thing save(Thing thing) {
// org.springframework.data.repository.CrudRepository.save
// Saves a given entity. Use the returned instance for further operations as the save operation might have changed the entity instance completely.
Thing saved = thingRepo.save(thing);
return saved;
}
答案 0 :(得分:2)
该论文没有说共享可变状态吗?在您的情况下,如果您在方法中声明列表然后使用forEach
,一切都很好。第二个答案here提到了你想要做的事情。
答案 1 :(得分:1)
如果你根本不改变它,几乎没有理由收集全新的List
。除此之外,您的用例基本上是迭代集合中的每个元素,并保存可以通过使用for-each
来实现的。
如果出于某种原因hingRepo.save(thing)
变异对象,你仍然可以返回相同的集合,但此时它是一个隐藏的变异,由于hingRepo.save(thing)
不建议,所以根本不可见这一点。