Scala中如何将Array[Seq[(Int, String)]]转换为Seq[(Int, String)]
Scala 嵌套集合扁平化合并实现方法
需求场景
将Array[Seq[(Int, String)]]类型的嵌套集合,合并为包含所有子Seq中(Int, String)元素的完整单层Seq[(Int, String)],对应示例如下:
- 待处理输入:
import scala.collection.mutable.ArrayBuffer // 输入结构 val nestedArr = Array( ArrayBuffer((1,"a"), (1,"group"), (1,"of")), ArrayBuffer((2,"following"), (2,"clues")), ArrayBuffer((3,"three"), (3,"girls")) )
- 期望输出:
Seq((1,"a"), (1,"group"), (1,"of"), (2,"following"), (2,"clues"), (3,"three"), (3,"girls"))
最简实现
直接调用Scala集合自带的flatten方法即可完成扁平化,一行代码就能实现需求:
val res: Seq[(Int, String)] = nestedArr.flatten
等价写法
如果需要在合并的同时做元素转换,或者想要更明确的书写逻辑,可以使用flatMap实现,和flatten效果完全等价:
// 写法1:传入identity函数直接返回每个子集合 val res2: Seq[(Int, String)] = nestedArr.flatMap(identity) // 写法2:显式返回子Seq,后续如果要加过滤、转换逻辑可以直接在内部修改 val res3: Seq[(Int, String)] = nestedArr.flatMap(subSeq => subSeq)
类型适配说明
flatten默认返回的集合类型和外层数组的元素类型兼容,如果需要指定返回为不可变List、Vector等具体Seq子类,直接在结果后调用对应转换方法即可:
// 转换为不可变List val listRes: List[(Int, String)] = nestedArr.flatten.toList
内容的提问来源于stack exchange,提问作者Damiano
相关产品推荐
相关产品推荐

