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))
解释
groupBy(_.key):把列表按Temp的第一个参数(key)分组,得到Map[String, List[Temp]].values:取出Map里的所有分组列表.map(_.maxBy(_.value)):对每个分组,取出value最大的那个Temp对象.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
相关产品推荐
相关产品推荐

