我是Scala的新手,尝试将一些现有的Java代码与Play Framework中的Scala特定功能集成。
val scalaMap = getScalaMap() // returns Map[String,Seq[String]]
将scalaMap转换为使用Java集合的简洁方法是什么?
val javaMap = ??? // java.util.Map<String,List<String>>
看起来我想使用JavaConversions,但我不确定如何将嵌套集合链接在一起。谢谢!
答案 0 :(得分:4)
试试这个:
import collection.JavaConverters._
val javaMap = scalaMap.mapValues(_.asJava).asJava
它分两步完成工作:
首先将Map[String,Seq[String]]
转换为Map[String,java.util.List[String]]
然后将整个地图改为Java Map
:java.util.Map[String,java.util.List[String]]
。
答案 1 :(得分:1)
请勿使用mapValues
。使用map
:
import collection.JavaConverters._
val javaMap = scalaMap.map { case (k,v) => (k, v.asJava) }.asJava
使用mapValues
将导致每次访问内部地图时重新转换。
Scala地图
scala> val scalaMap = Map(1 -> Map('a -> "A"), 2 -> Map('b -> "B"))
转换为Java Map(但每次转换内部地图时都会打印一些内容)
scala> val javaMapBad = scalaMap.mapValues(v => { println("evaluating "+v); v.asJava }).asJava
evaluating Map('a -> A)
evaluating Map('b -> B)
javaMapBad: java.util.Map[Int,java.util.Map[Symbol,java.lang.String]] = {1={'a=A}, 2={'b=B}}
scala> javaMapBad.get(1)
evaluating Map('a -> A) // Re-conversion!
res0: java.util.Map[Symbol,java.lang.String] = {'a=A}
scala> javaMapBad.get(1)
evaluating Map('a -> A) // Re-conversion!
res1: java.util.Map[Symbol,java.lang.String] = {'a=A}
正确的方法
scala> val javaMapGood = scalaMap.map{case (k,v) => {println("evaluating "+v); (k,v.asJava)}}.asJava
evaluating Map('a -> A)
evaluating Map('b -> B)
javaMapGood: java.util.Map[Int,java.util.Map[Symbol,java.lang.String]] = {1={'a=A}, 2={'b=B}}
scala> javaMapGood.get(1) // no re-conversion
res6: java.util.Map[Symbol,java.lang.String] = {'a=A}
scala> javaMapGood.get(1) // no re-conversion
res7: java.util.Map[Symbol,java.lang.String] = {'a=A}