使用JavaConversions在java和scala集合之间进行隐式转换

roc*_*god 0 java scala scala-collections

我使用泛型函数合并了scala Set的scalaMap

def mergeMaps[A, B](ms: Set[Map[A, B]])(f: (B, B) => B): Map[A, B] =
(Map[A, B]() /: (for (m <- ms; kv <- m) yield kv))
{
  (a, kv) =>
  a + (if (a.contains(kv._1)) kv._1 -> f(a(kv._1), kv._2) else kv)
}
Run Code Online (Sandbox Code Playgroud)

这可以处理存在相同键冲突的情况.但是,我想在Scala Code中使用Java集合.我研究了一下然后发现了JavaConversions.我导入了它并写了这个

def mergeMaps[A, B](ms: Set[Map[A, B]])(f: (B, B) => B): Map[A, B] =
(new util.HashMap[A, B] /: (for (m <- ms; kv <- m) yield kv))
{
  case (a, kv) =>
    a + (if (a.contains(kv._1)) kv._1 -> f(a(kv._1), kv._2) else kv)
}
Run Code Online (Sandbox Code Playgroud)

但是,它表示存在类型不匹配

Error:(67, 11) type mismatch;
found   : scala.collection.mutable.Map[A,B]
required: java.util.HashMap[A,B]
    a + (if (a.contains(kv._1)) kv._1 -> f(a(kv._1), kv._2) else kv)
      ^
Run Code Online (Sandbox Code Playgroud)

是不是JavaConversions用来隐式转换util.HashMapmutable.Map?我在这里错过了什么?

jwv*_*wvh 6

JavaConverter做你想要的吗?

scala> import scala.collection.JavaConverters._
import scala.collection.JavaConverters._

scala> val x = (new java.util.HashMap[Int,Int]).asScala
x: scala.collection.mutable.Map[Int,Int] = Map()
Run Code Online (Sandbox Code Playgroud)