将Java集合转换为Scala集合

oxb*_*kes 86 java scala scala-2.7 scala-collections

与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
Run Code Online (Sandbox Code Playgroud)

这似乎有效.批评是受欢迎的!

import scala.collection.immutable.Set
import scala.collection.jcl.Buffer 
val s: scala.collection.Set[String] =
                      Set(Buffer(javaApi.query( ... ) ) : _ *)
Run Code Online (Sandbox Code Playgroud)

rob*_*nst 123

供将来参考:使用Scala 2.8,可以这样做:

import scala.collection.JavaConversions._
val list = new java.util.ArrayList[String]()
list.add("test")
val set = list.toSet
Run Code Online (Sandbox Code Playgroud)

setscala.collection.immutable.Set[String]在此之后.

另请参阅Ben James对更明确方式的回答(使用JavaConverters),现在似乎是推荐的.

  • @oxbow_lakes我认为是时候将这个答案标记为接受的答案了. (7认同)

Ben*_*mes 62

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

import scala.collection.JavaConverters._
val l = new java.util.ArrayList[java.lang.String]
val s = l.asScala.toSet
Run Code Online (Sandbox Code Playgroud)


ste*_*ler 25

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

而不是JavaConversions使用:

import scala.collection.convert.wrapAll._
Run Code Online (Sandbox Code Playgroud)

正如aleksandr_hramcov所建议的那样.

而不是JavaConverters使用:

import scala.collection.convert.decorateAll._
Run Code Online (Sandbox Code Playgroud)

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

import scala.collection.convert.wrapAsScala._
Run Code Online (Sandbox Code Playgroud)

更新:JavaConversionsJavaConverters被弃用的 上述陈述似乎是错误的.Scala 2.10中有一些已弃用的属性,导致导入时出现弃用警告.所以这里的备用导入似乎只是别名.虽然我仍然喜欢它们,但恕我直言,这些名字更合适.


Jor*_*tiz 16

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

Set(javaApi.query(...).toArray: _*)
Run Code Online (Sandbox Code Playgroud)

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

  • 如果我想保留类型信息,此建议不起作用 (9认同)

Sur*_*apu 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
Run Code Online (Sandbox Code Playgroud)

  • 几年后重新审视这一点,Scala的JavaConverters是可行的方法. (6认同)

Xav*_*hot 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")
Run Code Online (Sandbox Code Playgroud)