web-dev-qa-db-ja.com

IntelliJが呼び出しチェーンをシーケンスに変換することを提案するのはなぜですか?

ソースセットsrcを宛先セットdstにマップする次のKotlinの例を想定します。

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()

これの利点は何ですか?

この場合、提案は最適ではありません。このコードを書き換える正しい方法は(IntelliJ警告も発生しません):

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

これにより、後でセットに変換される中間リストの作成が回避されます。データは結果セットにすぐに追加されます。

15
yole

Set.mapはリストを返します。リストに変換するとすぐにリストが破棄されます。 asSequenceの利点は、おそらく一時的なリストなしで、シーケンスが変換を行うことです。

11
Pezo