如何在Scala中将java.util.ArrayList转换为Seq[Seq[String]]?
将Java ArrayList嵌套集合转换为Scala Seq[Seq[String]]的方法
嘿,这个转换其实挺简单的,Scala对Java集合的互操作支持做得很到位,给你两种适配不同Scala版本的实现方式:
方法一:Scala 2.13+ 推荐用法
从Scala 2.13开始,官方推荐使用scala.jdk.CollectionConverters来处理Java和Scala集合的转换,代码如下:
import scala.jdk.CollectionConverters._ // 假设你的Java ArrayList已经初始化并添加了元素 val array: java.util.ArrayList[java.util.ArrayList[String]] = new java.util.ArrayList[java.util.ArrayList[String]] // ... 添加元素的代码 ... val scalaSeq: Seq[Seq[String]] = array.asScala.map { innerList => innerList.asScala.toSeq }.toSeq
代码解释:
array.asScala:把外层的JavaArrayList转换为Scala的可变Buffer(它是Seq的子类型)- 内层的
innerList.asScala.toSeq:把每个Java内部列表转换为Scala的不可变Seq - 最后调用
toSeq:把外层的可变Buffer转换为不可变的Seq,符合大多数场景下的不可变偏好
方法二:Scala 2.12及更早版本用法
在Scala 2.12及之前的版本,我们通常使用scala.collection.JavaConverters,代码逻辑和上面一致,只是导入的包不同:
import scala.collection.JavaConverters._ val array: java.util.ArrayList[java.util.ArrayList[String]] = new java.util.ArrayList[java.util.ArrayList[String]] // ... 添加元素的代码 ... val scalaSeq: Seq[Seq[String]] = array.asScala.map(_.asScala.toSeq).toSeq
额外提示
如果你的业务场景允许使用可变集合,其实可以省略最后的toSeq,直接使用asScala返回的Buffer(因为Buffer继承自mutable.Seq),但一般更推荐使用不可变的Seq来避免意外的副作用哦。
内容的提问来源于stack exchange,提问作者ps0604
相关产品推荐
相关产品推荐

