【发布时间】:2019-10-22 13:13:47
【问题描述】:
我和同事讨论过,我们不应该在 stream.map() 中使用 setter,就像这里建议的解决方案 - https://stackoverflow.com/a/35377863/1552771
对此答案有一条评论不鼓励以这种方式使用map,但没有给出理由说明为什么这是一个坏主意。有人可以提供一个可能的情况,为什么这会中断?
我看到一些讨论,人们谈论通过添加或删除项目来同时修改集合本身,但是使用map 只是为数据对象设置一些值有什么负面影响吗?
【问题讨论】:
-
我猜这取决于您设置的什么。
map应该将流的元素转换为不同的元素。因此,如果您只是“滥用”它来执行forEach并继续流(太糟糕了 forEach 不返回流),那么我认为这只是“糟糕的风格”而不是“危险的”。就像设置question.setAnswered(true)时设置器执行其他操作一样setAnswer(boolean b){ deppThought.meditateOverMeaningOfLive();}..setter用于设置,map()用于映射.. -
其中一个问题是,如果整个 Stream 管道决定不必执行它来计算最终结果,甚至可能不会执行
map操作。我使用 Java 11 遇到过它——我不确定它是否适用于早期版本——尽管没有这样的优化,但对于 Java 8。 -
我忘记了自己,但我有一种预感,除了@michalk 指定的问题之外,还有this 的原因。
-
@Avi 对原始问题的讨论提到修改对象不是干扰,因为它们不会修改数据 source (无论如何只包含引用)。跨度>
-
@michalk 在
count()的情况下,从Java 9 开始。在短路方法的情况下,如…Match或find…,总是map不是对所有元素执行。但是你也不能假设它只适用于必要的最小数量的元素,所以它只是不可预测的。 this answer 的大部分peek也适用于map中的副作用,仅在调整操作目的时(在需要时提供值)。
标签: java collections java-8 java-stream setter