我有以下情况: 我收到某种类型的迭代器,并希望将其转换为特定的地图。 我觉得可能有一种非常简单的方法可以做到这一点,但我似乎无法弄清楚:) 下面是一些使事情更容易理解的代码:(我将案例类简化为最低限度)
case class Fu(title: String)
case class Bar(name: String)
case class Match(f: Fu, b: Bar)
case class Result(name: String, fus: List[Fu])
val input: Iterator[Match] = ...
我最终想要的是:
val output: Iterator[Result]
这是棘手的部分: 比赛是独一无二的,但很自然地,每个比赛都可以匹配多个比赛。 我基本上希望所有具有相同Bar的匹配都被反汇编,并将他们的Fus放入列表中。有点像地图[Bar,List [Fu]],除了我有一个类型。 Result类也可以使用Bars而不是名称String,但我真的不需要其他Bar信息。但这并不重要。 并且输出类型也不是那么重要,无论是Iterator,Iterable,List还是其他任何东西。只要映射正常工作。
起初,我认为groupBy on Iterable会完全符合我的要求,但我可能无法弄清楚如何正确使用groupBy或者它是错误的工作函数:) 使用map似乎是一个好的开始,但那我如何构建列表呢?我可以轻松地将每个Match转换为Result,但最后我会得到许多具有相同名称的Result对象......
非常感谢,感谢任何帮助!
编辑:也许我应该说清楚它不是与字符串匹配。它们只是两个案例类的示例属性。所有Fus和Bars已经正确匹配到Match对象中。
答案 0 :(得分:5)
您与groupBy
走在了正确的轨道上。以下是它的外观:
val input: Iterator[Match] = Iterator(
Match(Fu("A"), Bar("1")),
Match(Fu("B"), Bar("2")),
Match(Fu("C"), Bar("1")),
Match(Fu("D"), Bar("2")))
val output =
input.toList
.groupBy { case Match(f, Bar(name)) => name }
.map { case (name, fus) => Result(name, fus.map(_.f)) }
output foreach println //> Result(1,List(Fu(A), Fu(C)))
//| Result(2,List(Fu(B), Fu(D)))