在Scala中,如何从对象列表创建HashMap而不使用循环?

12
我有一个对象列表,每个对象都有两个感兴趣的字段,我称之为“键”和“值”。 我需要构建一个由条目组成的HashMap,其中“键”映射到“值”。
我知道可以通过循环遍历列表并对列表中的每个项目调用hmap.put(obj.key,obj.value)来实现这一点。 但某种程度上它“有点不对劲”,看起来好像可以使用Scala的List操作中的一个简单代码行以及一些函数式的构造来完成此操作。 我有这种感觉吗?如果是,应该如何实现?
3个回答

24
list.map(i => i.key -> i.value).toMap

9
OP希望使用HashMap而不是Map - samthebest
1
警告:不支持重复的键! - Richard Gomes

9
此外:
Map(list map (i => i.key -> i.value): _*)

我认为这样做的好处是你可以指定需要的Map类型,因此它更具有一般性。 - Luigi Plinge
1
@LuigiPlinge 这是真的。我更喜欢使用.toMap,因为它更易读。如果性能非常重要,也许可以使用breakOut - Daniel C. Sobral
我对最后一部分感到困惑:_* 我知道下划线是函数变量的占位符,但我看不出它如何适用于该表达式,也不知道星号和冒号在这种情况下的作用。 - Gigatron
好的,我现在明白了。使用可变参数的Map.apply。 - Gigatron
1
注意:它不支持重复的键! - Richard Gomes

6
从集合中创建对象(请记住不要使用new关键字)
val result: HashMap[Int, Int] = HashMap(myCollection: _*)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接