将Java集合转换为Scala集合

java scala scala-collections scala-2.7

72087 观看

10回复

108733 作者的声誉

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

我其实想转换一个Java API调用Spring的 SimpleJdbcTemplate,它返回一个java.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( ... ) ) : _ *)
作者: oxbow_lakes 的来源 发布者: 2009 年 3 月 23 日

回应 (10)


1

39678 作者的声誉

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

val array = java.util.Arrays.asList("one","two","three").toArray
val list = List.fromArray(array)
作者: Fabian Steeg 发布者: 23.03.2009 06:50

16

4544 作者的声誉

决定

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

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

请注意,scala.collection.immutable.Set默认情况下可以使用Predef.scala

作者: Jorge Ortiz 发布者: 24.03.2009 07:51

2

2050 作者的声誉

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

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

这可能更好,因为集合包正在经历Scala 2.8的主要返工,并且scala.collection.jcl包正在消失

作者: Aaron 发布者: 23.03.2010 07:43

14

1348 作者的声誉

您可能还想探索这个优秀的库: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
作者: Surya Suravarapu 发布者: 12.05.2010 06:47

4

1381 作者的声誉

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

val list = array.toList.map(_.asInstanceOf[String])
作者: jamesqiu 发布者: 08.10.2010 07:26

122

22000 作者的声誉

供将来参考:使用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),现在似乎是推荐的。

作者: robinst 发布者: 19.10.2010 02:49

61

89227 作者的声誉

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

import scala.collection.JavaConverters._
val l = new java.util.ArrayList[java.lang.String]
val s = l.asScala.toSet
作者: Ben James 发布者: 15.06.2011 11:11

2

91 作者的声誉

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

import collection.convert.wrapAll._
作者: aleksandr_hramcov 发布者: 07.03.2014 05:38

25

672 作者的声誉

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

而不是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中有一些已弃用的属性,导致导入时出现弃用警告。所以这里的备用导入似乎只是别名。虽然我仍然喜欢它们,但恕我直言,这些名字更合适。

作者: stempler 发布者: 18.08.2014 08:52

0

9341 作者的声誉

开始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")
作者: Xavier Guihot 发布者: 29.03.2019 12:16
32x32