объединение операций zip и map в Scala - PullRequest
0 голосов
/ 30 апреля 2018

Я понимаю, что map и flatten операции могут быть объединены в flatMap, а filter и map в collect в Scala.

Можно ли как-нибудь объединить zip / zipwithIndex с операцией map?

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Если по какой-то причине вам действительно нужна комбинированная версия, вы можете написать ее самостоятельно.

implicit class SeqOps[A](s: Seq[A]) {
    def zipWithIndex2[A1 >: A, B >: Int, That](f: (A, Int) => (A1, B))(implicit bf: CanBuildFrom[Seq[A], (A1, B), That]): That = {
        val b = bf(s)
        var i = 0
        for (x <- s) {
            b += f(x, i)
            i += 1
        }
        b.result()
    }
}

Назовите это как:

s.zipWithIndex2 {
    case (a, b) => (a + "2", b + 2)
}

Я бы действительно подумал об этом дважды, и, скорее всего, воспользуюсь любым другим предложенным подходом.

0 голосов
/ 30 апреля 2018

Насколько я знаю, в стандартной библиотеке нет ни одной операции, но есть метод расширения для различных кортежей, который называется zipped. Этот метод возвращает объект, который предоставляет такие методы, как map и flatMap, которые будут выполнять сжатие в шаге с отображением:

(xs, ys).zipped.map((x, y) => x * y)

Этот объект также неявно преобразуется в Traversable, поэтому вы можете вызывать более сложные методы, такие как mkString или foldLeft.

...