与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( ... ) ) : _ *)
答案 0 :(得分:122)
供将来参考:使用Scala 2.8,可以这样做:
import scala.collection.JavaConversions._
val list = new java.util.ArrayList[String]()
list.add("test")
val set = list.toSet
在此之后 set
是scala.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")