#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 без чего-либо.