Как отобразить список по частям в котлине - PullRequest
0 голосов
/ 01 февраля 2019

Я часто сталкиваюсь с источниками данных, такими как (псевдокод ниже, а не какой-либо конкретный синтаксис, это просто для иллюстрации):

list = {
  "XLabel", 
  "XDescription", 
  "YLabel", 
  "YDescription", 
  "ZLabel", 
  "ZDescription"
}

желаемый вывод:

list = { 
  MyClass("XLabel", "XDescription"), 
  MyClass("YLabel", "YDescription"), 
  MyClass("ZLabel", "ZDescription")
}

Есть ли что-нибудь более чистое, чем сделать fold() и сложить его в новый список?Я также отказался делать что-то странное, например list.partition().zip()

Я в основном хочу более мощный map, который бы работал как mapChunks( it1, it2 -> MyClass(it1, it2)), где фрагментация является частью функции, поэтому она становится простой и приятной.(В моем примере список состоит из двух частей, но 3 также является распространенным вариантом использования.)

Существует ли эта функция?Или какой самый идиоматичный способ сделать это?

Ответы [ 4 ]

0 голосов
/ 01 февраля 2019

Вы можете создать функцию расширения , например mapChunks, и повторно использовать ее:

fun List<String>.mapChunks(): List<MyClass> {
    return chunked(2).map { MyClass(it[0], it[1]) }
}

val list1 = listOf(
    "XLabel",
    "XDescription",
    "YLabel",
    "YDescription",
    "ZLabel",
    "ZDescription"
)
val result1 = list1.mapChunks()

val list2 = listOf(
        "XLabel1",
        "XDescription1",
        "YLabel1",
        "YDescription1",
        "ZLabel1",
        "ZDescription1"
)
val result2 = list2.mapChunks()
0 голосов
/ 01 февраля 2019

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/chunked.html

Chunked возвращает подсписок указанного вами размера

Это вызов API, который вы хотите

, учитывая, что ваш список состоит из двух пар.может сделать это

list.chunked(2)  //List<List<String>>
    .map{MyClass(it[0], it[1]} //list<MyClass>
0 голосов
/ 01 февраля 2019

Я думаю, что метод windowed должен делать то, что вы хотите.

lst.windowed(size = 2, partialWindows = false) { innerList -> MyClass(innerList[0], innerList[1]) }

Вы также можете использовать chunked, но он вызывает windowed под капотом.Но с помощью chunked вы можете получить списки, которые содержат меньше элементов, чем вы ожидали

0 голосов
/ 01 февраля 2019

Вы можете использовать функцию chunked, а затем map поверх результата.Синтаксис становится очень близким к тому, что вы хотели, если вы деструктурируете лямбда-аргумент:

list.chunked(2)
    .map { (it1, it2) -> MyClass(it1, it2) }
    // Or use _it_ directly: .map { MyClass(it[0], it[1]) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...