将Java集合转换为Scala集合

时间:2009-03-23 18:46:15

标签: java scala scala-collections scala-2.7

与Stack Overflow问题 Scala equivalent of new HashSet(Collection) 相关,如何将Java集合(java.util.List说)转换为Scala集合List

我实际上是在尝试将Java API调用转换为Spring's SimpleJdbcTemplate,并将java.util.List<T>转换为Scala不可变HashSet。例如:

val l: java.util.List[String] = javaApi.query( ... )
val s: HashSet[String] = //make a set from l

这似乎有效。批评是受欢迎的!

import scala.collection.immutable.Set
import scala.collection.jcl.Buffer 
val s: scala.collection.Set[String] =
                      Set(Buffer(javaApi.query( ... ) ) : _ *)

10 个答案:

答案 0 :(得分:122)

供将来参考:使用Scala 2.8,可以这样做:

import scala.collection.JavaConversions._
val list = new java.util.ArrayList[String]()
list.add("test")
val set = list.toSet
在此之后

setscala.collection.immutable.Set[String]

另请参阅Ben James' answer以获得更明确的方式(使用JavaConverters),这似乎是现在推荐的。

答案 1 :(得分:61)

如果你想比robinst's answer中演示的JavaConversions更明确,你可以使用JavaConverters:

import scala.collection.JavaConverters._
val l = new java.util.ArrayList[java.lang.String]
val s = l.asScala.toSet

答案 2 :(得分:25)

JavaConversions robinst's answer)和 JavaConverters Ben James's answer)已被弃用 Scala 2.10

而不是 JavaConversions 使用:

import scala.collection.convert.wrapAll._

根据aleksandr_hramcov的建议。

而不是 JavaConverters 使用:

import scala.collection.convert.decorateAll._

对于两者,也可以分别仅将转换/转换器导入Java或Scala,例如:

import scala.collection.convert.wrapAsScala._

<强>更新 上面的语句 JavaConversions JavaConverters 被弃用似乎是错误的。 Scala 2.10中有一些已弃用的属性,导致导入时出现弃用警告。所以这里的备用导入似乎只是别名。虽然我仍然喜欢它们,但恕我直言,这些名字更合适。

答案 3 :(得分:16)

您的上一条建议有效,但您也可以避免使用jcl.Buffer

Set(javaApi.query(...).toArray: _*)

请注意,scala.collection.immutable.Set默认情况下Predef.scala可用。{/ 1}}。

答案 4 :(得分:14)

您可能还想探索这个优秀的库:scalaj-collection,它在Java和Scala集合之间进行双向转换。在您的情况下,要将java.util.List转换为Scala List,您可以执行以下操作:

val list = new java.util.ArrayList[java.lang.String]
list.add("A")
list.add("B")
list.asScala

答案 5 :(得分:4)

val array = java.util.Arrays.asList("one","two","three").toArray

val list = array.toList.map(_.asInstanceOf[String])

答案 6 :(得分:2)

您可以在toArray调用中添加类型信息,以使Set参数化:

 val s = Set(javaApi.query(....).toArray(new Array[String](0)) : _*)

这可能更好,因为集合包正在进行Scala 2.8的主要返工,而scala.collection.jcl包是going away

答案 7 :(得分:2)

解决此问题的另一种简单方法:

import collection.convert.wrapAll._

答案 8 :(得分:1)

您可以将Java集合转换为数组,然后从中创建Scala列表:

val array = java.util.Arrays.asList("one","two","three").toArray
val list = List.fromArray(array)

答案 9 :(得分:0)

Scala 2.13开始,软件包scala.jdk.CollectionConverters替换了软件包scala.collection.JavaConverters/JavaConversions._

import scala.jdk.CollectionConverters.Ops._

// val javaList: java.util.List[String] = java.util.Arrays.asList("one","two","three")
javaList.asScala
// collection.mutable.Buffer[String] = Buffer("one", "two", "three")
javaList.asScala.toSet
// collection.immutable.Set[String] = Set("one", "two", "three")