3

(:私は Scala にまったく慣れていないので、コレクション操作の最も一般的な操作にまだ苦労しています。)

List[Task] を Map に変換したいと思います。詳細は次のとおりです。

// assignee may be null
case class Task(assignee: String, description: String)
// might refactor it into:
// case class Task(assignee: Option[String], description: String)

Keysが担当者で、各ValueSet[Task]である Map が必要です。次の 2 つの状況の管理に問題があります。

  • Map はnullキーで (咳) フレンドリー (咳) ではありません (担当者に Option[String] を使用してこれを回避しました)。
  • キーがマップに既に存在するかどうか(既存のセットに値を追加するだけ)と、キーがすでに追加されているためセット値が存在するかどうかを区別する必要がある

私は次のことを思いつきましたが、過度に冗長に見えます。

def groupByAssignee(tasks : List[Task]) : Map[Option[String], Set[Task]] = {
 tasks.foldLeft(Map[Option[String], Set[Task]]())(
  (m, t) => {
    m.get(t.assignee) match {
      case Some(_) => m + ((t.assignee, m.get(t.assignee).get.+(t)))
      case _       => m + ((t.assignee, Set(t)))
    }
  })
}

これを達成するためのより簡単で明確な方法は何ですか?

ありがとう!

4

1 に答える 1

5

このユースケースは非常に一般的であるため、そのための組み込みメソッドがあります。

tasks groupBy {_.assignee}

groupByただし、必要なときに戻りMap[String,List[Task]]ます.Map[String, Set[String]]。これはそれを行う必要があります:

groupBy {_.assignee} mapValues {_ map {_.description} toSet}

groupBYフレンドリーですnullが、そうすべきではありません。Option[String]はるかに良く、より慣用的です。

于 2013-01-20T12:02:51.723 に答える