90

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

我实际上是在尝试将 Java API 调用转换为返回 a 的Spring 转换为 Scala immutable 。例如:SimpleJdbcTemplatejava.util.List<T>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( ... ) ) : _ *)
4

10 回答 10

127

供将来参考:使用 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 的答案以获得更明确的方式(使用 JavaConverters),现在似乎推荐使用这种方式。

于 2010-10-19T14:49:48.777 回答
62

如果您想比robinst 的答案中演示的 JavaConversions 更明确,可以使用 JavaConverters:

import scala.collection.JavaConverters._
val l = new java.util.ArrayList[java.lang.String]
val s = l.asScala.toSet
于 2011-06-15T11:11:21.677 回答
25

Scala 2.10已弃用JavaConversionsrobinst 的回答)和JavaConvertersBen James 的回答) 。

而不是JavaConversions使用:

import scala.collection.convert.wrapAll._

正如aleksandr_hramcov所建议的那样。

而不是JavaConverters使用:

import scala.collection.convert.decorateAll._

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

import scala.collection.convert.wrapAsScala._

更新: 上面关于JavaConversionsJavaConverters已被弃用的陈述似乎是错误的。Scala 2.10 中有一些已弃用的属性,在导入它们时会出现弃用警告。所以这里的替代进口似乎只是别名。尽管我仍然更喜欢它们,但恕我直言,这些名称更合适。

于 2014-08-18T08:52:38.550 回答
17

您的最后一个建议有效,但您也可以避免使用jcl.Buffer

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

请注意,scala.collection.immutable.Set由于Predef.scala.

于 2009-03-24T07:51:54.863 回答
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
于 2010-05-12T18:47:30.567 回答
5

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

import scala.jdk.CollectionConverters._

// 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")
于 2019-03-29T00:16:19.950 回答
3
val array = java.util.Arrays.asList("one","two","three").toArray

val list = array.toList.map(_.asInstanceOf[String])
于 2010-10-08T07:26:00.743 回答
2

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

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

这可能更可取,因为 collections 包正在经历 Scala 2.8 的重大返工,而 scala.collection.jcl 包正在消失

于 2010-03-23T19:43:10.817 回答
1

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

val array = java.util.Arrays.asList("one","two","three").toArray
val list = List.fromArray(array)
于 2009-03-23T18:50:03.340 回答
1

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

import collection.convert.wrapAll._
于 2014-03-07T05:38:26.417 回答