Scala中键为元组的Map:如何用case语句替代_._1分组
使用Scala模式匹配按元组元素分组,避免
_1 当然可以!用Scala的模式匹配(case语句)解构元组,不仅能彻底摆脱可读性差的_1._1写法,还能让代码更具语义化,维护起来也更轻松。
针对你给出的示例Map:
val m = Map( (1, true, "case0") -> List(1, 2), (2, false, "case0") -> List(3, 4), (1, true, "case1") -> List(2, 4) )
方法一:直接在groupBy中用case解构键值对
这是最简洁的写法,直接对Map的每个键值对做模式匹配,解构出你需要的元组元素:
val groupedByFirstElement = m.groupBy { case ((num, _, _), _) => num }
这里的case ((num, _, _), _)做了两件事:
- 把Map的键(三元组)解构为
(num, _, _):num是我们要用来分组的第一个元素,下划线_表示忽略元组的另外两个元素 - 下划线
_忽略Map的值部分(因为分组只需要键的第一个元素)
如果想让代码更清晰,还可以给元组的每个元素起有业务含义的名字,比如:
val groupedByFirstElement = m.groupBy { case ((id, isActive, caseName), data) => id }
这样别人看代码时,一眼就能明白每个元组元素的含义,比_1._1直观太多。
方法二:显式匹配键(更灵活的场景)
如果需要在分组前做额外逻辑,也可以先提取键,再单独做模式匹配:
val groupedByFirstElement = m.groupBy { entry => entry._1 match { case (num, _, _) => num } }
这种写法在需要对键做更多处理时会更灵活,但日常场景下第一种写法足够简洁。
结果验证
运行上述代码后,groupedByFirstElement的结果会是:
Map( 1 -> Map((1,true,"case0") -> List(1,2), (1,true,"case1") -> List(2,4)), 2 -> Map((2,false,"case0") -> List(3,4)) )
和用groupBy(._1._1)得到的结果完全一致,但代码可读性提升了不止一个档次。
内容的提问来源于stack exchange,提问作者Srivignesh
相关产品推荐
相关产品推荐

