将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