为什么 IntelliJ 建议将调用链转换为序列?
Why does IntelliJ suggest to convert a call chain into a Sequence?
假设以下 Kotlin 示例将源集 src
映射到目标集 dst
:
private val src: Set<String> = setOf("hello", "world")
private val dst: Set<Int> = src.map { it.length }.toSet()
这很好用。但是,IntelliJ 的代码检查建议: 集合上的调用链应转换为 'Sequence':
应用此建议会导致
private val dst: Set<Int> = src.asSequence().map { it.length }.toSet()
这样做有什么好处?
在这种情况下,建议不是最优的。重写此代码(也不会导致任何 IntelliJ 警告)的正确方法是:
src.mapTo(hashSetOf()) { it.length }
这将避免创建随后将转换为集合的中间列表;数据将立即添加到结果集中。
Set.map
returns 一个列表,然后将其转换为集合后立即丢弃。 asSequence
的好处是序列进行转换,大概没有临时列表。
假设以下 Kotlin 示例将源集 src
映射到目标集 dst
:
private val src: Set<String> = setOf("hello", "world")
private val dst: Set<Int> = src.map { it.length }.toSet()
这很好用。但是,IntelliJ 的代码检查建议: 集合上的调用链应转换为 'Sequence':
应用此建议会导致
private val dst: Set<Int> = src.asSequence().map { it.length }.toSet()
这样做有什么好处?
在这种情况下,建议不是最优的。重写此代码(也不会导致任何 IntelliJ 警告)的正确方法是:
src.mapTo(hashSetOf()) { it.length }
这将避免创建随后将转换为集合的中间列表;数据将立即添加到结果集中。
Set.map
returns 一个列表,然后将其转换为集合后立即丢弃。 asSequence
的好处是序列进行转换,大概没有临时列表。