为什么IntelliJ建议将调用链转换为序列?

And*_*mer 26 set intellij-idea code-inspection kotlin intellij-inspections

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

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

这很好用.但是,IntelliJ的代码检查表明:集合上的调用链应该转换为'Sequence':

集合上的调用链应转换为'序列'

应用此建议会导致

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

这有什么好处?

yol*_*ole 15

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

src.mapTo(hashSetOf()) { it.length }
Run Code Online (Sandbox Code Playgroud)

这将避免创建一个随后将转换为集合的中间列表; 数据将立即添加到结果集中.

  • 谢谢,我创建了一个问题:https://youtrack.jetbrains.com/issue/KT-26926. (3认同)
  • 我还没有看到`mapTo`的用法.它是作为成语提到的地方吗?特别是显示的用例如果是一个很好的例子 (2认同)

Pez*_*ezo 11

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