Kotlin大列表遍历:List构造器与map方法哪个更高效?
大型列表转换:两种Kotlin实现的效率对比
结论先行
如果你的myBigList是ArrayList、Array这类支持随机访问的集合,两种写法性能几乎没差;但如果是LinkedList这种不支持随机访问的集合,map方法的效率会甩索引遍历几条街。
具体拆解
1. 索引遍历的List构造器写法
return List(myBigList.size){ index -> val element = myBigList[index] myConversionFunction(element,param2,param3,param4) }
- 对随机访问集合来说,
myBigList[index]是O(1)的快速操作,整个转换过程是O(n)的时间复杂度,和map持平。 - 但如果是LinkedList这类集合,每次通过索引取元素都要从头遍历到目标位置,单次访问是O(n),整个转换就变成了O(n²)——数据量越大,性能崩得越厉害。
2. map方法写法
return myBigList.map{ myConversionFunction(it,param2,param3,param4) }
- map的底层是用迭代器遍历集合,不管集合支不支持随机访问,遍历都是O(n)的时间,整个转换过程稳定在O(n)。
- 而且代码更简洁,是Kotlin里集合转换的标准写法,可读性拉满。
实用推荐
- 优先用map:不用纠结集合类型,代码好看还能保证性能,绝大多数场景下都够用。
- 极致性能(仅针对超大随机访问集合):要是真的要抠那点性能,可以试试
buildList,不过提升非常有限,一般没必要:return buildList(myBigList.size) { myBigList.forEach { add(myConversionFunction(it, param2, param3, param4)) } } - 超大规模数据加速:如果转换函数是线程安全的无状态操作,数据量又大到百万级以上,可以用并行流:
注意:并行有线程开销,小数据量用反而变慢,谨慎选择。return myBigList.parallelStream() .map { myConversionFunction(it, param2, param3, param4) } .collect(Collectors.toList())
内容的提问来源于stack exchange,提问作者Cpereira1
相关产品推荐
相关产品推荐

