You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala中如何扁平化含空数组的数组?flatten函数适配问题

解决Array[_ <: Int]无法使用flatten并过滤空数组的问题

我懂你碰到的麻烦了——当你手里有个包含空数组的数组,想把它扁平化同时去掉空数组的时候,直接用flatten却报错,说这个函数不适用于Array[_ <: Int]类型对吧?这其实是因为Scala里flatten的工作要求:它需要集合里的每个元素本身是可遍历的(比如数组、列表这类实现了TraversableOnce的类型),但_ <: Int是Int的子类型,Int本身可不是可遍历的,编译器自然不买账。

下面分两种常见情况给你解决方案:

情况1:你的数组实际是Array[Array[Int]]

如果你的数组里的元素全是Int数组(只是混了空数组),那处理起来很简单:先过滤掉空数组,再调用flatten就行:

// 示例输入:包含空数组的Int数组
val input = Array(Array(1, 2), Array(), Array(3, 4), Array())
// 先过滤空数组,再扁平化
val output = input.filter(_.nonEmpty).flatten
// 输出结果:Array(1, 2, 3, 4)

情况2:你的数组是混合类型(比如同时有Int和Int数组)

如果你的数组里既有单个Int值,又有Int数组(类型被推断成了Array[Any],但你误当成了Array[_ <: Int]),那可以用flatMap结合模式匹配来处理,同时过滤空数组:

// 示例输入:混合了Int和Int数组的集合
val input: Array[Any] = Array(1, Array(2, 3), Array(), 4, Array())
val output = input.flatMap {
  // 匹配非空的Int数组,直接保留元素
  case arr: Array[Int] if arr.nonEmpty => arr
  // 匹配单个Int值,包装成数组再返回
  case num: Int => Array(num)
  // 其他情况(比如空数组)返回空数组,相当于过滤掉
  case _ => Array.empty[Int]
}
// 输出结果:Array(1, 2, 3, 4)

另外要提醒你:如果是你自己错误地把Array[Array[Int]]声明成了Array[_ <: Int],那得先修正类型声明——因为Array[Int]并不是Int的子类型,这种错误声明本身会导致编译失败的哦。

内容的提问来源于stack exchange,提问作者lserlohn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:38:45