【问题标题】:Convert Scala Set into Java (java.util.Set)?将 Scala Set 转换为 Java (java.util.Set)?
【发布时间】:2011-01-15 01:40:45
【问题描述】:

我在 Scala 中有一个 Set(我可以在创建 Set 时选择任何实现。我正在使用的 Java 库需要一个 java.util.Set[String]。

以下是在 Scala 中执行此操作的正确方法吗(使用 scala.collection.jcl.HashSet#underlying):

import com.javalibrary.Animals

var classes = new scala.collection.jcl.HashSet[String]
classes += "Amphibian"
classes += "Reptile"
Animals.find(classes.underlying)

它似乎工作正常,但由于我对 Scala 很陌生,我想知道这是否是首选方式(我尝试的任何其他方式都会出现类型不匹配错误):

error: type mismatch;
 found   : scala.collection.jcl.HashSet[String]
 required: java.util.Set[_]

【问题讨论】:

    标签: scala type-conversion scala-collections scala-2.8 scala-java-interop


    【解决方案1】:

    如果您询问的是 Scala 2.8,scala.collection.JavaConversions 提供了 Java 集合互操作性。在这种情况下,您需要 JavaConversions.asSet(...)(每个方向都有一个,Java -> Scala 和 Scala -> Java)。

    对于 Scala 2.7,包装 Java 集合的每个 scala.collection.jcl 类都有一个 underlying 属性,该属性提供包装的 Java 集合实例。

    【讨论】:

      【解决方案2】:

      对于 2.7.x,我强烈推荐使用:http://github.com/jorgeortiz85/scala-javautils

      【讨论】:

        【解决方案3】:

        自从 Scala 2.12.0 scala.collection.JavaConversions is deprecated:

        因此,此 API 已被弃用,应改用 JavaConverters。 JavaConverters 提供相同的转换,但通过扩展方法。

        从 Scala 2.8.1 开始,您可以为此目的 use scala.collection.JavaConverters

        import scala.collection.JavaConverters._
        val javaSet = new java.util.HashSet[String]()
        val scalaSet = javaSet.asScala
        val javaSetAgain = scalaSet.asJava
        

        【讨论】:

          【解决方案4】:

          在 Scala 2.12 中可以使用:scala.collection.JavaConverters.setAsJavaSet(scalaSetInstance)

          【讨论】:

            【解决方案5】:

            请注意,从Scala 2.13 开始,包scala.jdk.CollectionConverters 将替换已弃用的包scala.collection.JavaConverters/JavaConversions._

            import scala.jdk.CollectionConverters._
            
            // val scalaSet: Set[String] = Set("a", "b")
            val javaSet = scalaSet.asJava
            // javaSet: java.util.Set[String] = [a, b]
            javaSet.asScala
            // scala.collection.mutable.Set[String] = Set(a, b)
            

            【讨论】:

              猜你喜欢
              • 2014-10-14
              • 2011-09-02
              • 1970-01-01
              • 2011-08-22
              • 1970-01-01
              • 1970-01-01
              • 2018-06-08
              • 1970-01-01
              • 2020-09-23
              相关资源
              最近更新 更多