web-dev-qa-db-fra.com

Pourquoi IntelliJ suggère-t-il de convertir une chaîne d'appels en une séquence?

Supposons que l'exemple Kotlin suivant mappe l'ensemble source src à un ensemble de destination dst:

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

Cela fonctionne bien. Cependant, l'inspection du code d'IntelliJ suggère: La chaîne d'appel sur la collecte doit être convertie en "séquence":

Call chain on collection should be converted into 'Sequence'

L'application de cette suggestion entraîne

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

Quel en est l'avantage?

24

Dans ce cas, la suggestion n'est pas optimale. La bonne façon de réécrire ce code (qui n'entraîne également aucun avertissement IntelliJ) est la suivante:

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

Cela évitera la création d'une liste intermédiaire qui sera ensuite convertie en un ensemble; les données seront ajoutées immédiatement à l'ensemble résultant.

15
yole

Set.map renvoie une liste que vous jetez immédiatement après l'avoir convertie en un ensemble. L'avantage de asSequence est que la séquence effectue la conversion, probablement sans liste temporaire.

11
Pezo