与Stack Overflow问题Scala equivalent of new HashSet(Collection)相关,如何将Java集合( java.util.List
say)转换为Scala集合 List
?
我实际上是尝试将Java API调用转换为Spring's 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( ... ) ) : _ *)
9 回答
您的上一个建议有效,但您也可以避免使用
jcl.Buffer
:请注意,由于
Predef.scala
,scala.collection.immutable.Set
默认可用 .供将来参考:使用Scala 2.8,可以这样做:
set
在此之后是scala.collection.immutable.Set[String]
.另请参阅Ben James' answer以获得更明确的方式(使用JavaConverters),这似乎是现在推荐的 .
如果你想比robinst's answer中演示的JavaConversions更明确,你可以使用JavaConverters:
JavaConversions(robinst's answer)和JavaConverters(Ben James's answer)已被弃用 Scala 2.10 .
而不是JavaConversions使用:
正如aleksandr_hramcov所建议的那样 .
而不是JavaConverters使用:
对于两者,也可以分别仅将转换/转换器导入Java或Scala,例如:
Update: 上面声明JavaConversions和JavaConverters被弃用的陈述似乎是错误的 . Scala 2.10中有一些已弃用的属性,导致导入时出现弃用警告 . 所以这里的备用导入似乎只是别名 . 虽然我仍然喜欢它们,但恕我直言,这些名字更合适 .
您可能还想探索这个优秀的库:scalaj-collection,它在Java和Scala集合之间进行双向转换 . 在您的情况下,要将java.util.List转换为Scala List,您可以这样做:
您可以在toArray调用中添加类型信息以使Set参数化:
这可能更好,因为集合包正在经历Scala 2.8的主要返工,而scala.collection.jcl包是going away
另一种解决此问题的简单方法:
您可以将Java集合转换为数组,然后从中创建Scala列表: