首页 文章

将Java集合转换为Scala集合

提问于
浏览
83

与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 回答

  • 121

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

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

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

  • 59

    供将来参考:使用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' answer以获得更明确的方式(使用JavaConverters),这似乎是现在推荐的 .

  • 25

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

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

    JavaConversions(robinst's answer)和JavaConverters(Ben James's answer)已被弃用 Scala 2.10 .

    而不是JavaConversions使用:

    import scala.collection.convert.wrapAll._
    

    正如aleksandr_hramcov所建议的那样 .

    而不是JavaConverters使用:

    import scala.collection.convert.decorateAll._
    

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

    import scala.collection.convert.wrapAsScala._
    

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

  • 4

    您可能还想探索这个优秀的库: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
    
  • 1
    val array = java.util.Arrays.asList("one","two","three").toArray
    
    val list = array.toList.map(_.asInstanceOf[String])
    
  • 16

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

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

    这可能更好,因为集合包正在经历Scala 2.8的主要返工,而scala.collection.jcl包是going away

  • 2

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

    import collection.convert.wrapAll._
    
  • 14

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

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

相关问题