我有以下代码对我来说非常难看。是否有更简洁的方法来编写此代码?
type Bar = String
case class Foo(bars: List[Bar])
def groupByBar(foos: Seq[Foo]) = (for {
foo <- foos
bar <- foo.bars
} yield bar -> foo).
groupBy {case (bar, foo) => bar}.
map {case (bar, foos) => bar -> foos.map {_._2}}
答案 0 :(得分:1)
从您的代码中,您似乎想要一个需要List[Foo]
并返回Map[Bar, List[Foo]]
的函数,其中来自Bar
的每个List[Foo]
都映射到{{1}它包含它。
使用List[Foo]
和scalaz
:
foldMap
答案 1 :(得分:0)
使用核心集合,可以更简洁地完成(尽管不是特别清楚),如下所示:
def groupByBar(foos: Seq[Foo]) =
foos.flatMap(f => f.bars.map(b => (b,f))).groupBy(_._1).mapValues(_.map(_._2))