将 Java 集合转换为 Scala 集合
-
21-08-2019 - |
题
与堆栈溢出问题相关 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")