Scala如何获取嵌套Seq集合中所有Banner实例的height属性值
解决方法
你原来的代码只输出完整Banner实例是因为println的入参是整个Banner对象,只要修改为访问Banner的height属性即可。根据不同使用场景有两种最优实现:
场景1:仅需打印所有height值
直接修改原有遍历逻辑的打印内容即可,改动最小:
activeCampaigns.foreach(_.banners.foreach(banner => println(banner.height)))
场景2:需要收集所有height值为序列供后续处理
用Scala函数式特性的flatMap+map组合写法最简洁高效,和两层遍历性能一致但可读性更强:
// 直接提取所有height为Seq[Int]类型的集合 val allHeights: Seq[Int] = activeCampaigns.flatMap(_.banners).map(_.height) // 需要打印时遍历该集合即可 allHeights.foreach(println)
也可以用等价的for推导式写法,逻辑更直观:
val allHeights: Seq[Int] = for { campaign <- activeCampaigns banner <- campaign.banners } yield banner.height
实现说明
flatMap会自动把每个Campaign下的banners列表展开,合并为全局的Banner序列,不需要手动处理两层嵌套的遍历逻辑,是Scala处理嵌套集合提取属性的惯用实现。
内容的提问来源于stack exchange,提问作者Vakindu
相关产品推荐
相关产品推荐

