Столкнувшись с подобной задачей, я добавил в Iterable
s следующее сутенер:
implicit class IterableOfIterablePimps[T](collOfColls: Iterable[Iterable[T]]) {
def mapZipped[V](f: Iterable[T] => V): Iterable[V] = new Iterable[V] {
override def iterator: Iterator[V] = new Iterator[V] {
override def next(): V = {
val v = f(itemsLeft.map(_.head))
itemsLeft = itemsLeft.map(_.tail)
v
}
override def hasNext: Boolean = itemsLeft.exists(_.nonEmpty)
private var itemsLeft = collOfColls
}
}
}
Имея это, можно сделать что-то вроде:
val collOfColls = List(List(1, 2, 3), List(4, 5, 6), List(7, 8, 9))
collOfColls.mapZipped { group =>
group // List(1, 4, 7), then List(2, 5, 8), then List(3, 6, 9)
}
Обратите внимание, что вы должны внимательно рассмотреть тип коллекции, переданный как вложенный Iterable
, поскольку для него будут периодически вызываться tail
и head
. Итак, в идеале вы должны передать Iterable[List]
или другой набор с быстрыми tail
и head
.
Кроме того, этот код ожидает вложенные коллекции одинакового размера. Это был мой вариант использования, но я подозреваю, что это может быть улучшено, если это необходимо.