Как преобразовать список кортежей в кортеж списков? - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть пример, чтобы показать, что я имею в виду:

fun makeRange(i: Int) = Pair(i - 1, i + 1)
val listOfData = listOf(1, 2, 3, 4, 5, 6)

val pairs = listOfData
                .map { makeRange(it) }
val leftRange = pairs.map { it.first }
val rightRange = pairs.map { it.second }

У меня есть список и функция, которая возвращает кортеж.Но результат, который мне нужен, это два списка.Мне нужно что-то подобное:

    // can I get something like that ?
    val (leftRange, rightRange) = listOfData.map { makeRange(it) } ...

Есть ли способ сделать это?

1 Ответ

0 голосов
/ 19 ноября 2018

Если вы действительно хотите деструктурировать его следующим образом, я бы также разделил вашу makeRange -функцию, например:

fun makeLeftRange(i: Int) = i - 1
fun makeRightRange(i: Int) = i + 1
fun makeRange(i: Int) = makeLeftRange(i) to makeRightRange(i) // if you still need it...

Тогда вы можете деструктурировать следующим образом:

val (leftRange, rightRange) = listOfData.map(::makeLeftRange) to listOfData.map(::makeRightRange)

Или, если это действительно такая простая функция, почему бы не использовать вместо нее следующее:

val (leftRange, rightRange) = listOfData.map(Int::dec) to listOfData.map(Int::inc)
// or
val (leftRange, rightRange) = listOfData.map { it - 1 } to listOfData.map { it + 1 }

Если вы хотите сохранить makeRange как есть и хотите сделать это таким образом,будет немного уродливее, например:

val (leftRange, rightRange) = listOfData.map(::makeRange).let { 
  listOfPairs -> listOfPairs.map { it.first } to listOfPairs.map { it.second }
}

В основном повторное использование того, что вы показали в дополнительном let утверждении.

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