В стандартной библиотеке нет аналогичной процедуры, но вы можете приблизиться:
scala> List(List(1,2,3),List(5,6,7),List(14,13,12)).transpose
res3: List[List[Int]] = List(List(1, 5, 14), List(2, 6, 13), List(3, 7, 12))
scala> List(List(1,2,3),List(5,6,7),List(14,13,12)).transpose.map(_.sum)
res4: List[Int] = List(20, 21, 22)
Примечание. transpose
требует, чтобы все вложенные коллекции имели одинаковый размер.
Дополнение к вашему комментарию.
Я не уверен, что вы понимаете, что такое zipped
. Он преобразует 2 подколлекции внутри кортежа (Tuple2
) в единую коллекцию кортежей, каждый из которых затем может быть передан функции, которая принимает 2 параметра заданных типов. Это также доступно для 3 подколлекций внутри Tuple3
, становящихся коллекцией троек, но это предел.
Кроме того, я не знаю, почему вы думаете, что «zipped
— это один вызов функции, а не два». Если вы следуете link, предложенный Ричардом Скривеном в его комментарии, и сравните два предложенных решения, вы увидите, что они имеют одинаковое количество шагов/операторов.
На мой взгляд, преимущества/недостатки распределяются следующим образом:
- Если вы имеете дело с коллекциями разных типов, скажем,
Seq[Int]
и Seq[Char]
, то вам нужно получить их zipped
перед применением к ним функции «объединителя»: f(i1,c1)
, затем f(i2,c2)
, затем f(i3,c3)
и т. д.
- Ни один из подходов не справляется с подколлекциями разного размера.
transpose
вызовет исключение, а zipped
просто проигнорирует все элементы за пределами максимального индекса наименьшей подколлекции.
- Если ваша функция «объединитель» принимает более трех аргументов, вы не можете использовать
zipped
.
- Если ваш «объединитель» принимает коллекцию в качестве входных данных, то
transpose
, вероятно, будет лучшим/более простым вариантом.
person
jwvh
schedule
02.07.2016
mapply
в Scala! - person Hack-R   schedule 02.07.2016zipped
это то, что я ищу. Спасибо! - person Shuklaswag   schedule 02.07.2016