向空Seq[String]追加元素未实现预期合并效果的技术问询
问题分析与解决方案
你的代码核心问题有两个:
- 每次循环用
enrichmentColumnsList= cond直接覆盖原有集合,而非追加元素,最终只保留最后一次的结果。 - 内层
for (i <- 0 to columnMappingConf.size)完全多余,它会循环columnMappingConf.size + 1次,重复赋值同一个cond,导致控制台多次打印相同内容。
方案1:可变集合适配原有写法
如果想沿用可变变量的思路,改用ListBuffer存储元素,通过批量追加替代覆盖:
import scala.collection.mutable.ListBuffer var enrichmentColumnsList: ListBuffer[String] = ListBuffer.empty datasetEnricherConf.map(_.columnMappingsConf).foreach { columnMappingConf => val cond = columnMappingConf.map(_.destColumnName) println(s"cond:$cond") enrichmentColumnsList ++= cond // 批量追加元素,而非覆盖 } // 可选:转成不可变Seq val finalColumns: Seq[String] = enrichmentColumnsList.toSeq println(s"enrichmentColumnsList:$finalColumns")
方案2:纯函数式实现(Scala推荐风格)
Scala更推荐使用不可变集合与纯函数操作,避免var,通过flatMap直接收集所有目标元素:
val enrichmentColumnsList: Seq[String] = datasetEnricherConf .map(_.columnMappingsConf) .flatMap { columnMappingConf => val cond = columnMappingConf.map(_.destColumnName) println(s"cond:$cond") cond } println(s"enrichmentColumnsList:$enrichmentColumnsList")
执行上述任一方案后,都会得到你预期的合并结果:
enrichmentColumnsList:List(NODE, NODE_temp, NETWORK, SITETYPE, STATEORPROVINCE, DISTRICT, CLUSTER, REGION)
内容的提问来源于stack exchange,提问作者Vikrant Singh Rana
相关产品推荐
相关产品推荐

