如何将嵌套的 scala 集合转换为嵌套的 Java 集合

2022-09-03 02:14:32

我在Scala和Java之间遇到了编译问题。

我的 Java 代码需要一个

java.util.Map<Double, java.lang.Iterable<Foo>>

我的 scala 代码有一个

Map[Double, Vector[Foo]]

我收到编译错误:

error: type mismatch;
found   : scala.collection.immutable.Map[scala.Double,Vector[Foo]
required: java.util.Map[java.lang.Double,java.lang.Iterable[Foo]]

scala.collection.JavaConversions似乎不适用于嵌套集合,即使Vector可以直接转换为可迭代。除了迭代 scala 集合并手动进行转换之外,我能做些什么来使类型正常工作吗?


答案 1

scala.collection.JavaConversions恕我直言,应该被弃用。最好使用 明确说明转换发生的地点和时间。在您的情况下:scala.collection.JavaConverters

import scala.collection.JavaConverters._

type Foo = Int // Just to make it compile
val scalaMap = Map(1.0 -> Vector(1, 2)) // As an example

val javaMap = scalaMap.map { 
  case (d, v) => d -> v.toIterable.asJava
}.asJava

答案 2

这更适合我的需求:

  def toJava(m: Any): Any = {
    import java.util
    import scala.collection.JavaConverters._
    m match {
      case sm: Map[_, _] => sm.map(kv => (kv._1, toJava(kv._2))).asJava
      case sl: Iterable[_] => new util.ArrayList(sl.map( toJava ).asJava.asInstanceOf[util.Collection[_]])
      case _ => m
    }
  }

推荐