gpt4 book ai didi

java - 使用java流将最后遇到的值放入 map

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:24:43 24 4
gpt4 key购买 nike

我有一些代码如下:

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

具体来说,我想从列表中获取值并将它们放入 map 中。一切都很完美。不过,我担心的是订购。

例如,如果列表有:

a1, b1, a2

我如何确保最终 map 包含:

a->a2
b->b1

代替

a->a1
b->b1

传入列表是有序的,stream().filter() 应该保持顺序,但我在 Collectors.toMap 的文档中看不到任何关于输入的排序。

这在一般情况下是安全的,还是到目前为止我的测试用例很幸运?我是否会依赖 JVM 并面临 future 发生这种变化的风险?

如果我只写一个 for 循环,这很容易保证,但潜在流行为的“模糊性”让我担心。

我不打算为此使用并行,我纯粹是想了解在到达 toMap 的顺序非并行流的情况下的行为。

最佳答案

术语“最新值”有点误导。由于您希望根据遇到顺序获取最后一个值,答案是 toMap 将遵循遇到顺序。

Its documentation引用 Map.merge 来解释合并函数的语义,但不幸的是,该文档也有点单薄。它没有提到这个函数是用 (oldValue,newValue) 显式调用的;只能从代码示例中推导出来。

toMap’s documentation进一步说明:

The returned Collector is not concurrent. For parallel stream pipelines, the combiner function operates by merging the keys from one map into another, which can be an expensive operation. If it is not required that results are merged into the Map in encounter order, using toConcurrentMap(Function, Function, BinaryOperator, Supplier) may offer better parallel performance.

因此,如果不需要遇到顺序,它会明确指向不同的收集器。通常,Collectors 提供的所有内置收集器只是无序的,如果明确说明,这只是“...并发...”收集器和 toSet() 收集器的情况。

关于java - 使用java流将最后遇到的值放入 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42117352/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com