Гарантирован ли индексированный индекс Котлина для сохранения порядка - PullRequest
1 голос
/ 24 марта 2019

mapIndexed в массиве с любопытством возвращает List не массив, который не является интуитивно понятным.

Я также заметил, что kotlin.collections.mapIndexed документация не упоминает сохранение заказа, но kotlin.sequences.mapindexed делает.

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

Ответы [ 2 ]

0 голосов
/ 25 марта 2019

Указание на то, что заказ сохраняется, также находится в / library / stdlib / test / collection / IterableTests.kt (ссылка на последнюю редакцию в master на данный момент) официального репозитория Kotlin

abstract class IterableTests<T : Iterable<String>>(val createFrom: (Array<out String>) -> T, val empty: T) {
    fun createFrom(vararg items: String): T = createFrom(items)

    val data = createFrom("foo", "bar")

[...]

    @Test
    fun mapIndexed() {
        val shortened = data.mapIndexed { index, value -> value.substring(0..index) }
        assertEquals(2, shortened.size)
        assertEquals(listOf("f", "ba"), shortened)
}

Таким образом, тест также принимает тот же порядок вывода. Кстати, это странно, так как этот код используется не только для тестирования List и других, но и для тестирования неупорядоченного Set.

Аналогичный код используется для тестирования mapIndexed на массивах всех типов.

0 голосов
/ 25 марта 2019

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

Порядок, по крайней мере, гарантирован реализацией метода, как вы можете видеть ниже. Расширенный цикл for используется для циклического прохождения всей коллекции и применяет изменения только к соответствующему индексу.

Тот факт, что он возвращает List, является логичным, поскольку вы получите тот же List обратно (фактически полная копия - но с теми же объектами), только с необходимыми изменениями.

/**
 * Applies the given [transform] function to each element and its index in the original collection
 * and appends the results to the given [destination].
 * @param [transform] function that takes the index of an element and the element itself
 * and returns the result of the transform applied to the element.
 */
public inline fun <T, R, C : MutableCollection<in R>> Iterable<T>.mapIndexedTo(destination: C, transform: (index: Int, T) -> R): C {
    var index = 0
    for (item in this)
        destination.add(transform(checkIndexOverflow(index++), item))
    return destination
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...