3

我是 Scala 的新手,试图将一些现有的 Java 代码与 Play Framework 中的 Scala 特定功能集成。

val scalaMap = getScalaMap() // returns Map[String,Seq[String]]

将 scalaMap 转换为使用 Java 集合的好方法是什么?

val javaMap = ???  //  java.util.Map<String,List<String>> 

看起来我想使用 JavaConversions,但我不确定如何将嵌套集合链接在一起。谢谢!

4

2 回答 2

4

尝试这个:

import collection.JavaConverters._
val javaMap = scalaMap.mapValues(_.asJava).asJava

它分两步完成工作:

  1. 首先转换Map[String,Seq[String]]Map[String,java.util.List[String]]

  2. 然后整个映射到Java Map:。java.util.Map[String,java.util.List[String]]

于 2012-10-05T14:12:32.723 回答
1

不要使用mapValues. 使用map

import collection.JavaConverters._
val javaMap = scalaMap.map { case (k,v) => (k, v.asJava) }.asJava

使用mapValues将导致内部映射在每次访问时都被重新转换。

演示

斯卡拉地图

scala> val scalaMap = Map(1 -> Map('a -> "A"), 2 -> Map('b -> "B"))

转换为 Java Map(但每次转换内部 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}
于 2012-10-05T20:17:09.827 回答