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

Scala如何简洁实现按首参去重并保留次参最大值的列表归约?

简洁实现按Key分组取最大值的Temp列表

嘿,这个需求其实用Scala的集合API就能很优雅地解决,不用写一堆繁琐的groupBy+reduce代码,给你两种简洁方案:

方案一:直观易读的GroupBy + MaxBy

如果你追求代码简洁、可读性高,直接用groupBy配合maxBy就能搞定,一行代码完成转换:

case class Temp(key: String, value: Int)

val originalList = List(Temp("a",1), Temp("a",2), Temp("b",1))

val result = originalList.groupBy(_.key).values.map(_.maxBy(_.value)).toList
// 输出:List(Temp(a,2), Temp(b,1))

解释

  1. groupBy(_.key):把列表按Temp的第一个参数(key)分组,得到Map[String, List[Temp]]
  2. .values:取出Map里的所有分组列表
  3. .map(_.maxBy(_.value)):对每个分组,取出value最大的那个Temp对象
  4. .toList:把最终的Map值转换成List

这个写法比分开写groupBy再reduce要紧凑得多,逻辑也一目了然。


方案二:高性能的FoldLeft遍历

如果你的数据量很大,想要一次遍历完成(避免groupBy带来的两次遍历开销),可以用foldLeft来构建一个临时Map,实时保留每个key对应的最大value的Temp:

val result = originalList.foldLeft(Map.empty[String, Temp]) { (acc, current) =>
  acc.get(current.key) match {
    case Some(existing) if existing.value >= current.value => acc
    case _ => acc + (current.key -> current)
  }
}.values.toList

解释

  • 初始化一个空Map作为累积器(acc)
  • 遍历每个Temp对象:
    • 如果当前key已经在Map里,且已有的Temp的value更大,就保留原Map
    • 否则(key不存在,或者当前Temp的value更大),更新Map里的这个key对应的Temp
  • 最后取出Map的所有值转成List

这种方式只需要遍历一次列表,性能更优,适合处理大规模数据。


两种方案都能达到你想要的效果,根据自己的场景选就行啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:52:04