La combinación de múltiples predicados no funciona.
Estoy tratando de filtrar ciertos elementos de una lista y combinarlos en la lista final en un orden específico. El primer fragmento de código parece ineficiente ya que crea 2 listas para filtrar y luego itera sobre ellas, sin embargo, ese código funciona. El segundo fragmento de código intenta combinar ambos filtrados, sin embargo, el operador de mapeo no está agregando elementos a la lista otherNums. ¿Podría alguien ayudarme a entender por qué está sucediendo esto?
Fragmento de código 1:
fun main() {
val favItem = 0
val list = listOf(11, 12, 13, 2,3,4,5,6,7,10, favItem)
val greaterThan10 = list.filter{item -> item > 10}
val otherNums = list.asSequence().filter{item -> item != favItem}.filter{item -> item < 10}
println(" $greaterThan10") //la lista está llena de números apropiados
println("lista combinada ${greaterThan10.plus(favItem).plus(otherNums)}")
}
Resultado:
[11, 12, 13]
lista combinada [11, 12, 13, 0, 2, 3, 4, 5, 6, 7]
Fragmento de código 2:
fun main() {
val favItem = 0
val list = listOf(11, 12, 13, 2,3,4,5,6,7,10, favItem)
val greaterThan10 = mutableListOf<int>()
val otherNums = list.asSequence().filter{item -> item != favItem}.map{
if(it > 10) {
greaterThan10.add(it)
}
it
}
.filter{item -> item != 10}
println("$greaterThan10") //la lista está vacía
println("lista combinada ${greaterThan10.plus(favItem).plus(otherNums)}")
}
Resultado:
[]
lista combinada [0, 11, 12, 13, 2, 3, 4, 5, 6, 7]
davy.ai
En el Fragmento de Código 2, el operador
map
no está agregando elementos a la listagreaterThan10
porquemap
es una operación perezosa, lo que significa que solo se ejecutará cuando la secuencia resultante realmente se use. En este caso, la operaciónfilter
que sigue almap
no es suficiente para activar la ejecución de la operaciónmap
, ya que también es una operación perezosa.Para solucionar este problema, podemos usar el operador
toList
después de la operaciónmap
, lo que obligará a evaluar la secuencia y llenar la listagreaterThan10
.Fragmento de Código 2 Actualizado:
Resultado: