【发布时间】:2017-08-14 14:01:52
【问题描述】:
我有一段看起来像这样的代码。
我已经阅读了关于此的两条相互矛盾的(?)“规则”。
- 那个
.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;
}
【问题讨论】:
-
您能否提供有关 .foreach 规则的确切来源?它是关于它正在处理的对象的变量,还是任何类型的变量? (说“更新可变变量”有点奇怪——“更新不可变变量”是什么意思?)无论如何,我可能建议在这里使用 for 循环,通过显式集合管理,流并不能真正为您节省任何工作或在这里给出更清晰的说明。
-
关键是要避免干扰。当同一个
Thing实例在源集合中出现不止一次时,您可能会遇到它,但我假设您可以根据您的应用程序逻辑排除它。然后,这取决于thingRepo.save(…)如何改变thingRepo的状态。一般来说,在通过forEach填充列表之前,我会考虑不使用流,因为后者不会产生比for循环更简单、更清晰的代码。
标签: java foreach java-8 java-stream map-function