与Stack Overflow相关的问题Scala相当于新的HashSet(Collection),如何将Java集合(java.util.List
比如说)转换为Scala集合List
?
我其实想转换一个Java API调用Spring的 SimpleJdbcTemplate
,它返回一个java.util.List
,成一个斯卡拉不变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( ... ) ) : _ *)
robinst.. 123
供将来参考:使用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]
在此之后.
另请参阅Ben James对更明确方式的回答(使用JavaConverters),现在似乎是推荐的.
供将来参考:使用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]
在此之后.
另请参阅Ben James对更明确方式的回答(使用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所建议的那样.
而不是JavaConverters使用:
import scala.collection.convert.decorateAll._
对于两者,还可以分别仅将转换/转换器导入Java或Scala,例如:
import scala.collection.convert.wrapAsScala._
更新:JavaConversions和JavaConverters被弃用的 上述陈述似乎是错误的.Scala 2.10中有一些已弃用的属性,导致导入时出现弃用警告.所以这里的备用导入似乎只是别名.虽然我仍然喜欢它们,但恕我直言,这些名字更合适.
您的上一个建议有效,但您也可以避免使用jcl.Buffer
:
Set(javaApi.query(...).toArray: _*)
请注意,scala.collection.immutable.Set
默认情况下可以使用Predef.scala
.
您可能还想探索这个优秀的库: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