为啥 IntelliJ 建议将调用链转换为序列?
Posted
技术标签:
【中文标题】为啥 IntelliJ 建议将调用链转换为序列?【英文标题】:Why does IntelliJ suggest to convert a call chain into a Sequence?为什么 IntelliJ 建议将调用链转换为序列? 【发布时间】:2019-02-22 06:59:49 【问题描述】:假设以下 Kotlin 示例将源集 src
映射到目标集 dst
:
private val src: Set<String> = setOf("hello", "world")
private val dst: Set<Int> = src.map it.length .toSet()
这很好用。但是,IntelliJ 的代码检查表明:集合上的调用链应转换为“序列”:
应用此建议会导致
private val dst: Set<Int> = src.asSequence().map it.length .toSet()
这样做有什么好处?
【问题讨论】:
【参考方案1】:在这种情况下,建议不是最理想的。重写此代码的正确方法(也不会导致任何 IntelliJ 警告)是:
src.mapTo(hashSetOf()) it.length
这将避免创建随后将转换为集合的中间列表;数据将立即添加到结果集中。
【讨论】:
谢谢,我为此创建了一个问题:youtrack.jetbrains.com/issue/KT-26926。 我没有看到很多mapTo
的用法。它在某处被称为成语吗?尤其是显示的用例,如果是一个很好的例子【参考方案2】:
Set.map
返回一个列表,然后在将其转换为集合后立即将其丢弃。 asSequence
的好处是序列进行转换,大概没有临时列表。
【讨论】:
以上是关于为啥 IntelliJ 建议将调用链转换为序列?的主要内容,如果未能解决你的问题,请参考以下文章
为啥建议从矩阵中获取最大值的函数->无法将'int(*)[C]'转换为'int(*)[0]