Почему IntelliJ предлагает преобразовать цепочку вызовов в последовательность?

Предположим следующий пример 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()

В чем выгода этого?

2 ответа

Решение

В этом случае предложение является субоптимальным. Правильный способ переписать этот код (который также не приводит к каким-либо предупреждениям IntelliJ):

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

Это позволит избежать создания промежуточного списка, который впоследствии будет преобразован в набор; данные будут добавлены в результирующий набор сразу.

Set.map возвращает список, который вы сразу же выбрасываете после преобразования в набор. Преимущество asSequence является то, что последовательность выполняет преобразование, предположительно без временного списка.

Другие вопросы по тегам