【发布时间】:2017-02-08 15:36:59
【问题描述】:
我有一些代码如下:
Map<RiskFactor, RiskFactorChannelData> updateMap =
updates.stream().filter(this::updatedValueIsNotNull). // Remove null updated values
collect(Collectors.toMap(
u -> u.getUpdatedValue().getKey(), // then merge into a map of key->value.
Update::getUpdatedValue,
(a, b) -> b)); // If two values have the same key then take the second value
具体来说,我想从列表中获取值并将它们放入地图中。这一切都完美无缺。不过我担心的是订购。
例如,如果列表有:
a1, b1, a2
如何确保最终地图包含:
a->a2
b->b1
而不是
a->a1
b->b1
传入的列表是有序的,stream().filter() 应该保持顺序,但我在Collectors.toMap 的文档中看不到任何关于输入排序的内容。
这在一般情况下是安全的,还是到目前为止我的测试用例很幸运?我是否会依赖 JVM 并在未来面临这种变化的风险?
如果我只写一个 for 循环,这很容易保证,但潜在流行为的“模糊性”让我担心。
我不打算为此使用并行,我只是想了解在达到toMap 的顺序非并行流的情况下的行为。
【问题讨论】:
-
我不知道它是否安全,但如果不是,您可以在
Collectors.toMap上游使用Collectors.groupingBy -
@assylias First 不是骗子,不包括 toMap
-
@TimB 你的问题在
collect- toMap 只会消耗任何收集通过。
标签: java java-stream