使用JavaConversions在Java和Scala集合之间进行隐式转换。

7 浏览
0 Comments

使用JavaConversions在Java和Scala集合之间进行隐式转换。

我使用了一个通用函数将一个scala Set中的scala Map合并起来:

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)
}

这个函数处理了键冲突的情况。然而,我想在Scala代码中使用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)
}

然而,它报告了类型不匹配的错误:

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)
      ^

JavaConversions不是用于将util.HashMap隐式转换为mutable.Map吗?我在这里漏掉了什么?

0
0 Comments

问题的出现原因是在Java和Scala之间进行集合转换时,需要进行隐式转换。解决方法是使用JavaConversions提供的隐式转换方法。

在Scala中,可以使用import scala.collection.JavaConverters._导入JavaConversions库。然后可以使用asScala方法将Java集合转换为Scala集合。

具体代码如下:

import scala.collection.JavaConverters._
val x = (new java.util.HashMap[Int,Int]).asScala

这样就可以将Java的HashMap转换为Scala的mutable.Map。

希望对你有所帮助。

0
0 Comments

问题的出现原因是JavaConversions库已被弃用,推荐使用JavaConverters库。原来的代码中使用的是JavaConversions库中的方法,因此出现了类型不匹配的错误。解决方法是使用JavaConverters库中的方法来实现隐式转换。在新的代码中,将java.util.HashMap变量使用asScala方法进行转换,将其转换为scala.collection.mutable.Map,然后使用toMap方法将其转换为scala.collection.immutable.Map。这样就解决了类型不匹配的问题。最后,将转换后的变量作为参数传递给for循环,并在循环中进行操作。通过这种方式,就实现了Java和Scala集合之间的隐式转换。最后提到了JavaConversions库已被弃用,并给出了JavaConverters库的文档链接。

0