Преобразование Seq[A] в Map[Int, Seq[A]]

#scala #transformation

#scala #преобразование

Вопрос:

Как я могу преобразовать Seq [A] в Map [Int, Seq [A]] в Scala, где значение Int является параметром A (функциональным способом)?

Пример:

 val futures: Seq[Future[Seq[A]]] = ???
val gathered = Future.collect(futures)
gathered.map {
    res => {
       val myseq:Seq[A] = res.flatten
       myseq.map(a => (a.param, a)).toMap
    }
}
  

результирующим значением будет Map [Int, A] . Вместо этого я хотел бы иметь последовательность всех A, имеющих один и тот же параметр Int (Map [Int, Seq[A])

Комментарии:

1. Вопрос очень неясен. Вы хотите преобразовать Seq(1,2,3) в Map of (1-> ??).. ?

2. значение myseq = Seq((1, 2), (1, 3), (3,4)) ожидается: Map(1-> Seq(2, 3), 3 -> Seq(4))

3. @sonix пожалуйста, обновите свой вопрос, потому что звучало так, будто вы хотели взять какой-то тип A и использовать его функцию-член / значение для группировки вашей последовательности в map.

Ответ №1:

Вам нужно будет доказать компилятору, что существует параметр типа A , который может быть получен и который удовлетворяет вашему условию:

 trait Param[A]{
  def extract(that: A): Int
}

def seqToMap[A](seq: Seq[A])(implicit proof: Param[A]) = 
  seq groupBy (proof.extract)
  

Кроме этого, вы могли бы использовать структурные типы (которые включают отражение и, следовательно, действительно нецелесообразны по соображениям производительности.)

Комментарии:

1. Можете ли вы рассказать больше о последней строке? Здесь используются структурные типы. Краткий пример помог бы 🙂

2. почему вообще требуются черта и неявный? вы предполагаете, что A это параметр типа?

3. @erikallik потому что без реального типа A неоднозначен. Вы не можете доказать, что A имеет method .param без чего-либо.