scala 集合转java_将Java集合转换为Scala集合

将Java集合转换为Scala集合

与Stack Overflow相关的问题Scala相当于新的HashSet(Collection),如何将Java集合(SimpleJdbcTemplate说)转换为Scala集合java.util.List?

我实际上是尝试将Java API调用转换为Spring的SimpleJdbcTemplate,它返回java.util.List,转换为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( ... ) ) : _ *)

10个解决方案

122 votes

供将来参考:使用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 answered 2019-09-04T14:06:16Z

61 votes

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

import scala.collection.JavaConverters._

val l = new java.util.ArrayList[java.lang.String]

val s = l.asScala.toSet

Ben James answered 2019-09-04T14:06:43Z

25 votes

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中有一些已弃用的属性,导致导入时出现弃用警告。 所以这里的备用导入似乎只是别名。 虽然我仍然喜欢它们,但恕我直言,这些名字更合适。

stempler answered 2019-09-04T14:07:57Z

16 votes

您的上一个建议有效,但您也可以避免使用scala.collection.immutable.Set:

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

请注意,由于Predef.scala,默认情况下scala.collection.immutable.Set可用。

Jorge Ortiz answered 2019-09-04T14:05:29Z

14 votes

您可能还想探索这个优秀的库: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

Surya Suravarapu answered 2019-09-04T14:08:24Z

4 votes

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

val list = array.toList.map(_.asInstanceOf[String])

jamesqiu answered 2019-09-04T14:08:43Z

2 votes

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

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

这可能更好,因为集合包正在经历Scala 2.8的主要返工,并且scala.collection.jcl包正在消失

Aaron answered 2019-09-04T14:09:19Z

2 votes

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

import collection.convert.wrapAll._

aleksandr_hramcov answered 2019-09-04T14:09:56Z

1 votes

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

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

val list = List.fromArray(array)

Fabian Steeg answered 2019-09-04T14:10:24Z

0 votes

从Scala 2.13开始,包scala.jdk.CollectionConverters替换包scala.collection.JavaConverters/JavaConversions._:

import scala.jdk.CollectionConverters.Ops._

// 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")

Xavier Guihot answered 2019-09-04T14:10:53Z

你可能感兴趣的:(scala,集合转java)