Как улучшить группировку по голове - PullRequest
0 голосов
/ 05 марта 2019

Предположим, у меня есть такой код:

case class A(xs: Seq[Int])

def groupByHead(as: Seq[A]): Map[Int, Seq[A]] = 
  as.filter(_.xs.nonEmpty).groupBy(_.xs.head)

groupByHead работает нормально, но мне не нравится groupBy(_.xs.head), потому что head небезопасно. Как бы вы улучшили это?

Ответы [ 2 ]

2 голосов
/ 05 марта 2019

Как насчет этого:

def groupByHead(as: Seq[A]): Map[Int, Seq[A]] = 
  as.groupBy(_.xs.headOption).collect{ case (Some(key), x) => key -> x }
2 голосов
/ 05 марта 2019

В принципе, вы можете collect только те A s, где последовательность не пуста, и с тех пор конвертировать ее в значение, которое одновременно является конструктивным доказательством не пустота последовательности:

def groupByHead(as: Seq[A]) = 
  as.collect { case a @ A(h +: t) => (h, a) }.groupBy(_._1).mapValues(_.map(_._2))

но это выглядит немного искусственно. В данном конкретном случае «небезопасные» .head кажутся меньшим злом, между filter и groupBy.

мало что может пойти не так.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...