Java流映射带有sideeffect并收集或foreach并填充结果列表

时间:2017-03-22 12:41:46

标签: java foreach java-8 java-stream map-function

我有一段看起来像这样的代码。

我读过两个矛盾的(?)"规则"对此。

我如何解决它,以便我使用流并仍然返回一个列表,或者我应该只是跳过流?

@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;
}

2 个答案:

答案 0 :(得分:2)

该论文没有说共享可变状态吗?在您的情况下,如果您在方法中声明列表然后使用forEach,一切都很好。第二个答案here提到了你想要做的事情。

答案 1 :(得分:1)

如果你根本不改变它,几乎没有理由收集全新的List。除此之外,您的用例基本上是迭代集合中的每个元素,并保存可以通过使用for-each来实现的。

如果出于某种原因hingRepo.save(thing)变异对象,你仍然可以返回相同的集合,但此时它是一个隐藏的变异,由于hingRepo.save(thing)不建议,所以根本不可见这一点。