我有一个java映射stringMap,其中键是表示日期的字符串,值是长的。我需要将这个映射转换成一个collection.mutable.HashMap[DateTime, Long],也就是说,除了更改映射的类型之外,我还需要从String转换为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的隐式转换。
问题是,有什么更好的方法吗?我试着使用一个for / map方法,但是他们返回的是一个Map而不是一个collection.mutable.HashMap编辑:很明显,突破是有效的。/EDIT
最好有一种函数式编程方法来实现这一点,而不需要临时的dateTimeMap。
发布于 2014-12-18 01:44:44
首先,建议使用JavaConverters来获得显式转换,以避免多次意外转换。
通过指定预期的结果类型,您应该能够在breakOut上使用map:
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)发布于 2014-12-18 01:40:56
如果我理解你的问题,这是否可行。
val result = collection.mutable.HashMap[DateTime, Long](stringMap.map{ case (k,v) => (df.parseDateTime(k),v)}.toArray:_* )https://stackoverflow.com/questions/27537794
复制相似问题