Почему IntelliJ предлагает преобразовать цепочку вызовов в последовательность?
Предположим следующий пример 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()
В чем польза от этого?
Ответы
Ответ 1
В этом случае предложение является субоптимальным. Правильный способ переписать этот код (что также не приводит к каким-либо предупреждениям IntelliJ):
src.mapTo(hashSetOf()) { it.length }
Это позволит избежать создания промежуточного списка, который впоследствии будет преобразован в набор; данные будут добавлены в результирующий набор сразу.
Ответ 2
Set.map
возвращает список, который затем сразу же выкидывает после преобразования его в набор. Преимущество asSequence
состоит в том, что последовательность делает преобразование, по-видимому, без временного списка.