Scala映射转换为HashMap

6
给定一个这个类的Person对象的列表: class Person(val id : Long, val name : String) 使用“scala方式”获取一个(java)HashMap,其中id为键,name为值?
如果最佳答案不包括使用.map,请提供一个带有它的示例,即使这样做会更难。
谢谢。
编辑
这就是我现在拥有的,但它并不是太不可变:
val map = new HashMap[Long, String]
personList.foreach { p => map.put(p.getId, p.getName) }

return map

1
你目前的版本已经很不错了,但如果你需要经常在Scala和Java集合之间进行转换,请看一下scala.collections.JavaConvertersscala.collections.JavaConversions - mpartel
这样怎么样:(1) 使用personList的大小预先分配足够的条目到空HashMap中,然后(2)return java.collections.unmodifiableMap(map)? 当可变状态被限制在一个本地对象中时,它是可以接受的 - 没有副作用 :) - 9000
如果这是首选的方式,请写一个答案,以便我可以接受它。 - Pablo Fernandez
我几乎不会阅读Scala,所以我不确定这是否是首选方式。但它应该可行;让我们看看评论者说了什么。 - 9000
@mpartel - 提醒一下:我将您的答案转换为评论,因为虽然它是有用的信息,但似乎并没有实际回答问题。 - Shog9
2个回答

11
import collection.JavaConverters._
val map = personList.map(p => (p.id, p.name)).toMap.asJava
  • personList 的类型是 List[Person]

  • 在执行完 .map 操作后,你会得到一个 List[Tuple2[Long, String]](通常写作 List[(Long, String)])。

  • 在执行完 .toMap 操作后,你会得到一个 Map[Long, String]

  • .asJava 则会将它转换成 Java map,正如名称所示。

你不需要定义 .getName.getid,因为 .name.id 已经是 getter 方法了。这种像值访问的外观是有意为之的,并遵循统一访问原则。


1
你可能会遇到 -> 方法,像这样创建元组:personList.map(p => (p.id -> p.name))。在Scala文档中非常常见。但是,在极少数情况下,这可能导致类型推断问题,您必须提供显式类型或回退到标准元组语法。 - drstevens

2
这样怎么样:
  • 使用 personList 的大小预分配足够的条目在空的 HashMap 中,
  • 运行 foreach 循环,
  • 如果需要不可变性,则返回 java.collections.unmodifiableMap(map)

这种方法不会创建任何中间对象。当可变状态被限制在一个本地对象中时是可以的 - 没有副作用 :)

免责声明:我对Scala知之甚少,因此在投票时请谨慎考虑。


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