Недавно я хотел добавить немного сахара в скользящие итераторы, поэтому придумал следующее:
implicit class SlidingOps[A](s: Seq[A]) {
def slidingPairs = (s, s.tail).zipped
def slidingTriples = (s, s.tail, s.tail.tail).zipped
}
Это работает с любым Seq
, но, вероятно, наиболее эффективно с List
..zipped
возвращает объект scala.runtime.Tuple2Zipped
(или Tuple3Zipped
для 3-элементного кортежа), который определяет несколько знакомых методов высшего порядка, так что их аргументы принимают несколько аргументов,так что вы можете написать:
points.slidingPairs.foreach { (a, b) => ... }
или даже:
(1 to 10).slidingTriples.map(_ + _ + _)
Вы можете оптимизировать реализацию, если хотите, чтобы она была действительно эффективной для типов, не включенных в список.