与堆栈溢出问题相关 Scala 相当于 new HashSet(Collection) , ,如何转换 Java 集合(java.util.List 比如说)到 Scala 集合中 List?

我实际上正在尝试将 Java API 调用转换为 春天的 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( ... ) ) : _ *)
有帮助吗?

解决方案

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

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

注意 scala.collection.immutable.Set 默认情况下可用,感谢 Predef.scala.

其他提示

备查:使用 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] 在这之后。

另请参阅 本·詹姆斯的回答 对于更明确的方式(使用JavaConverters),现在似乎推荐。

如果您想比中演示的 JavaConversions 更明确 罗宾斯特的回答, ,您可以使用 JavaConverters:

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

Java转换 (罗宾斯特的回答) 和 Java转换器 (本·詹姆斯的回答) 已被弃用 斯卡拉2.10.

代替 Java转换 使用:

import scala.collection.convert.wrapAll._

正如建议的 亚历山大·赫拉姆科夫.

代替 Java转换器 使用:

import scala.collection.convert.decorateAll._

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

import scala.collection.convert.wrapAsScala._

更新:上面的声明 Java转换Java转换器 被弃用似乎是错误的。Scala 2.10 中有一些已弃用的属性,导致导入它们时出现弃用警告。所以这里的备用导入似乎只是别名。尽管我仍然更喜欢它们,但恕我直言,这些名字更合适。

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

val list = new java.util.ArrayList[java.lang.String]
list.add("A")
list.add("B")
list.asScala
val array = java.util.Arrays.asList("one","two","three").toArray

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

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

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

这可能更可取,因为 Collections 包正在经历 Scala 2.8 的重大返工,并且 scala.collection.jcl 包是 离开

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

import collection.convert.wrapAll._

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

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

开始 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")
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top