如何在Scala中将Java List转换为数组?含POJO类型转换问题
Java List 转 Scala Array 解决方案
嘿,我来帮你搞定这两个转换问题,刚好之前处理过类似的场景,给你梳理两种靠谱的方法:
问题1:普通Java List转Scala Array
有两种常用方式,推荐结合Scala的集合转换器来做,代码更简洁直观:
方法1:使用Scala集合转换器(Scala 2.13+ 推荐)
先导入转换器,把Java List转成Scala的可迭代集合,再转成Array:
import scala.jdk.CollectionConverters._ // 示例Java List val javaStringList: java.util.List[String] = new java.util.ArrayList[String]() javaStringList.add("Scala") javaStringList.add("Java") // 转换为Scala Array[String] val scalaStringArray: Array[String] = javaStringList.asScala.toArray
方法2:直接使用Java的带参数toArray方法
Java的无参toArray()默认返回Object[],但我们可以传入指定类型的数组来获取对应类型的结果:
val javaIntList: java.util.List[Integer] = new java.util.ArrayList[Integer]() javaIntList.add(1) javaIntList.add(2) // 传入空的同类型数组,Java会自动创建对应长度的类型数组 val scalaIntArray: Array[Integer] = javaIntList.toArray(Array.empty[Integer])
问题2:java.util.List[POJO] 转 Scala Array[POJO]
你遇到的Array[Object]问题,正是因为用了无参的toArray()方法!下面给你两种解决思路:
方案1:用Scala集合转换器(最省心)
和普通List转换逻辑一致,转换器会自动保留POJO类型:
import scala.jdk.CollectionConverters._ // 假设你的POJO类是这样的 class MyPOJO(val name: String) // 示例Java POJO List val javaPojoList: java.util.List[MyPOJO] = new java.util.ArrayList[MyPOJO]() javaPojoList.add(new MyPOJO("Alice")) javaPojoList.add(new MyPOJO("Bob")) // 直接转换为Scala Array[MyPOJO] val scalaPojoArray: Array[MyPOJO] = javaPojoList.asScala.toArray
方案2:Java带参数toArray方法指定类型
如果不想用Scala的转换器,就给toArray()传一个POJO类型的空数组,强制指定返回类型:
// 同样基于上面的MyPOJO和javaPojoList val scalaPojoArray: Array[MyPOJO] = javaPojoList.toArray(Array.empty[MyPOJO]) // 也可以传入指定长度的数组,比如: // val scalaPojoArray: Array[MyPOJO] = javaPojoList.toArray(new MyPOJO[javaPojoList.size()]) // 不过空数组的写法更简洁,Java内部会优化创建合适长度的数组
为什么之前得到Array[Object]?
Java的List.toArray()无参方法的设计就是返回Object[],这是Java的泛型擦除导致的——运行时无法直接获取List的泛型类型,所以只能返回最顶层的Object数组。而带参数的toArray(T[])方法可以通过传入的数组类型来确定返回的数组类型,Scala的集合转换器则是在编译期帮我们处理了类型推导,所以能得到正确的类型数组。
内容的提问来源于stack exchange,提问作者Harita Parmar
相关产品推荐
相关产品推荐

