Kotlin的mapIndexed是否保证保留排序

时间:2019-03-24 20:41:42

标签: kotlin collections

奇怪的是,数组上的

mapIndexed返回List而不是不是立即直观的数组。

我还注意到kotlin.collections.mapIndexed documentation没有提到保留顺序,但是kotlin.sequences.mapindexed却保留了。

我知道,由于在文档中没有明确说明,因此我不应该依赖它,而是想知道这是否是故意遗漏的原因。

3 个答案:

答案 0 :(得分:0)

我认为这是一个遗漏,更改元素的顺序并不是那么实际,效果会很差。

顺序的执行至少可以保证该顺序,如下所示。 增强的for循环用于遍历整个集合,并将更改仅应用于相关索引。

它返回一个foo.browser.js的事实是合乎逻辑的,因为只有获得所需的更改后,您才能获得相同的main.browser.js(实际上是完整副本-但具有相同的对象)。 / p>

List

答案 1 :(得分:0)

官方Kotlin存储库的/libraries/stdlib/test/collections/IterableTests.kt(此时链接到Router的最新修订版)上也保留了订单

master

[...]

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

答案 2 :(得分:0)

订单保留在结果中。 在这里查看我的代码-更改列表中的第一项:

val convertedResults = mutableListOf<DisplayItem>()

myList.mapIndexedNotNullTo(convertedResults) { index, item ->
        val member = DisplayItem(item)
        if (member.id == "id_007") {
            // add it first in the list 
            convertedResults.add(0, member)
            null
        } else
            member
}

这很好。但是我不知道如何在这里衡量性能。告诉我您如何看待这段代码。