【问题标题】:Convert map to HashMap and apply transforms将 map 转换为 HashMap 并应用转换
【发布时间】:2014-12-18 01:29:02
【问题描述】:

我有一个 java 映射 stringMap,其中键是表示日期的字符串,值是长整数。我需要把这个map转成collection.mutable.HashMap[DateTime, Long],也就是除了改变map的类型,还要从Strings改成DateTimes。

这是我目前使用的解决方案:

import scala.collection.JavaConversions._
val df = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
val stringMap: java.util.HashMap[String, Long] = ...
val dateTimeMap = stringMap map { case (k, v) => (df.parseDateTime(k), v)}
val result = collection.mutable.HashMap[DateTime, Long](dateTimeMap.toArray:_*)

最后一行来自this post

注意有一个隐式转换将 stringMap 转换为 scala Hashmap。

问题是,有没有更好的方法来做到这一点?我尝试使用带有突破的 for yield / map 方法,但他们返回的是 Map 而不是 collection.mutable.HashMap 编辑:显然突破确实有效。 /编辑

最好有一种函数式编程方式来做到这一点,而不需要临时的dateTimeMap

【问题讨论】:

    标签: scala type-conversion scala-collections


    【解决方案1】:

    首先,建议使用JavaConverters 来进行显式转换,以避免意外转换多次。

    通过指定预期的结果类型,您应该能够在map 上使用breakOut

    import scala.collection.breakOut
    import scala.collection.JavaConverters._
    
    val stringMap: java.util.HashMap[String, Long] = new java.util.HashMap()
    stringMap.put("1", 1L)
    stringMap.put("2", 2L)
    
    val result: collection.mutable.HashMap[Int, Long] = stringMap.asScala.map { case (k, v) => (k.toInt, v) }(breakOut)
    // result: scala.collection.mutable.HashMap[Int,Long] = Map(2 -> 2, 1 -> 1)
    

    【讨论】:

    • 所以事实证明,如果你做同样的事情,除了尝试使用隐式转换而不是 asScala,它不起作用。不幸的是,我正在处理的项目的样式约定是使用隐式转换而不是使用任何显式转换。有没有办法在遵守他们的风格约定的同时完成这项工作?
    • 隐式版本对我有用。只需将 JavaConverters 替换为 JavaConversions 并删除 .asScala 即可。
    • 哦,你是对的。我尝试用空格替换map 之前的点。谢谢。
    【解决方案2】:

    如果我理解您的问题,这是否可行。

      val result = collection.mutable.HashMap[DateTime, Long](stringMap.map{ case (k,v) => (df.parseDateTime(k),v)}.toArray:_* )
    

    【讨论】:

    • 这个解决方案基本上只是制作 dateTimeMap 而没有给它一个名字。我希望不必制作这张临时地图,一秒钟后就把它扔掉。我希望跳过制作这个临时地图而直接创建结果地图。
    • @KevinWheeler - 哦,好吧。我猜上面的 dhg 解决方案应该可以工作吗?
    猜你喜欢
    • 2015-01-14
    • 2020-10-17
    • 2015-06-01
    • 2016-01-18
    • 2022-12-05
    • 1970-01-01
    • 2012-06-02
    • 2012-08-18
    • 1970-01-01
    相关资源
    最近更新 更多