如何对包含乘客列表的List<Trips>按乘客姓名执行groupBy分组
实现逻辑
因为单个行程(Trip)会对应多名乘客,无法直接通过groupBy为单个行程返回多个分组键,所以需要先将「1个Trip对应N个乘客」的一对多关系,拆解为N个「乘客姓名 -> 对应Trip」的一对一映射,再按乘客姓名分组收集行程即可。
正确实现代码
val result: Map<String, List<Trip>> = trips // 展开为所有[乘客姓名-所属行程]的键值对 .flatMap { trip -> trip.passengers.map { passenger -> passenger.name to trip } } // 按乘客姓名分组,收集对应行程 .groupBy( keySelector = { it.first }, valueTransform = { it.second } )
原代码错误说明
你原有写法的核心问题是groupBy的lambda要求每一个Trip元素只能返回一个分组键,无法同时匹配多个乘客作为键,因此无法实现一对多的分组映射。
补充说明
如果业务场景中存在重名乘客,需要区分不同乘客的行程时,可以直接用Passenger对象作为分组键,替换上述代码中的passenger.name即可,此时返回的Map类型为Map<Passenger, List<Trip>>。
内容的提问来源于stack exchange,提问作者Ademord
相关产品推荐
相关产品推荐

