将Scala Set转换为Java(java.util.Set)?

时间:2010-02-10 00:32:09

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

我在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[_]

5 个答案:

答案 0 :(得分:23)

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

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

答案 1 :(得分:7)

自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

答案 2 :(得分:5)

对于2.7.x我高度建议使用:http://github.com/jorgeortiz85/scala-javautils

答案 3 :(得分:0)

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

答案 4 :(得分:0)

请注意,从Scala 2.13开始,软件包scala.jdk.CollectionConverters取代了已弃用的软件包scala.collection.JavaConverters/JavaConversions._

import scala.jdk.CollectionConverters.Ops._

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