在scala中反向查找嵌套属性

时间:2014-04-15 23:21:16

标签: scala

我有以下代码对我来说非常难看。是否有更简洁的方法来编写此代码?

  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}}

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))