将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.scala
, scala.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._
更新:上面的JavaConversions和JavaConverters被弃用的声明似乎是错误的。 在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)