将Java集合转换为Scala集合

相关的堆栈溢出问题斯卡拉相当于新的HashSet(集合) ,我如何将一个Java集合( java.util.List说)转换成一个Scala集合List

我实际上正在尝试将Java API调用转换为Spring的 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( ... ) ) : _ *) 

你的最后一个build议jcl.Buffer ,但你也可以避免使用jcl.Buffer

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

请注意,由于Predef.scalascala.collection.immutable.Set默认可用。

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

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

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

JavaConversions ( robinst的答案 )和JavaConverters ( Ben James的答案 )已经被Scala 2.10弃用了。

而不是JavaConversions使用:

 import scala.collection.convert.wrapAll._ 

正如aleksandr_hramcov所build议的那样。

而不是JavaConverters使用:

 import scala.collection.convert.decorateAll._ 

对于这两者,也只能将转换/转换器分别导入Java或Scala,例如:

 import scala.collection.convert.wrapAsScala._ 

更新:上面的JavaConversionsJavaConverters被弃用的声明似乎是错误的。 在Scala 2.10中有一些不推荐的属性,导致它们导入时的弃用警告。 所以这里的替代import似乎只是别名。 虽然我仍然喜欢他们,因为恕我直言,名字是更合适的。

您可能还想探索一下这个优秀的库: scalaj-collection ,它在Java和Scala之间有双向转换。 在你的情况下,要将java.util.List转换为Scala列表,你可以这样做:

 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调用中添加types信息以使Set被参数化:

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

这可能是可取的,因为收集包正在经历Scala 2.8的重大修改,而scala.collection.jcl包将会消失

解决这个问题的另一个简单方法是:

 import collection.convert.wrapAll._ 

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

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