为什么IntelliJ建议将呼叫链转换为序列?

时间:2018-09-18 09:22:37

标签: intellij-idea kotlin set code-inspection intellij-inspections

假设下面的Kotlin示例将源集src映射到目标集dst

private val src: Set<String> = setOf("hello", "world")
private val dst: Set<Int> = src.map { it.length }.toSet()

这很好。但是,IntelliJ的代码检查建议: 收集时的调用链应转换为“序列”:

Call chain on collection should be converted into 'Sequence'

应用此建议会导致

private val dst: Set<Int> = src.asSequence().map { it.length }.toSet()

这有什么好处?

2 个答案:

答案 0 :(得分:15)

在这种情况下,建议不理想。重写此代码(也不会导致任何IntelliJ警告)的正确方法是:

src.mapTo(hashSetOf()) { it.length }

这将避免创建中间列表,该中间列表随后将转换为集合;数据将立即添加到结果集中。

答案 1 :(得分:11)

Set.map返回一个列表,然后将其转换为集合后立即将其丢弃。 asSequence的好处是序列可以进行转换,大概没有临时列表。