Kotlin - Функционально Traverse Collection получает текущее / следующее значение - PullRequest
3 голосов
/ 07 июня 2019

В Kotlin есть функциональный способ пройти через List<T>, получив Pair<T,T>, который отражает текущий / следующий элемент.

Например, императивный подход будет выглядеть примерно так:

for (index in 0 until list.size-1) {
        val current = list[index]
        val next = list[index + 1]
        //do calculations on current/next.
    }

Что-то вроде list.forEachPaired { it: Pair<String,String?> ->//do something }

Ответы [ 3 ]

5 голосов
/ 07 июня 2019

windowed (параметры см. В ссылке).Если вы хотите работать, в частности, с Pair s, вы можете использовать перегрузку с transform:

list.windowed(2) { Pair(it[0], it[1]) }.forEach { ... }

, но я бы просто написал

list.windowed(2).forEach { ... }

, где параметрforEach лямбда - это List<T> длины 2.

3 голосов
/ 07 июня 2019

Хотя windowed() является мощным, в этом случае есть немного более простая альтернатива: zipWithNext(). Например:

list.zipWithNext().forEach{ (first, second) ->
    // ...
}
2 голосов
/ 07 июня 2019

Я согласен с Алексеем Романовым, что промежуточные Pair на самом деле не нужны. Вы можете деструктурировать свои оконные списки в forEach лямбду:

list.windowed(2).forEach { (first, second) ->

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...