Modificar el valor de los elementos en una lista en Groovy
Tengo una lista de listas. Las listas internas contienen objetos “Car”.
def myList = [ [new Car(model: ".Model1.", year: 2020)] ]
Como puedes ver, el objeto “Car” tiene algunos puntos en su propiedad “modelo” y me gustaría eliminarlos.
Lo que intenté es esto:
myList = myList.collect { it.collect { it.model.replace(".", "") } }
Pero esto no funciona porque al final de esta instrucción obtengo esto:
myList = [ ["Model1"] ]
Esto no es lo que necesito, en realidad necesito los objetos antiguos con solo la propiedad “modelo” actualizada. En mi caso, todavía tendría el objeto “Car” pero con la propiedad “modelo” actualizada a “Model1” en lugar de “.Model1.”. ¿Cómo puedo lograr esto?
Cualquier ayuda es apreciada, gracias.
Una solución que encontré es esta:
myList = myList.collect { it.collect { it.model = it.model.replace(".", ""); return it } }
Como sugirió @cfrick, esto también funciona para mí:
myList.each { it.each { it.model = it.model.replace(".", "") } }
Aunque no estoy seguro si esta es la mejor solución.
davy.ai
Explicación:
En el enfoque original, estabas usando el método
collect
que aplica una transformación a cada elemento de la lista y devuelve una nueva lista de elementos transformados. Entonces, cuando aplicascollect
dos veces, básicamente obtienes una lista anidada con cada elemento teniendo la cadena del modelo sin puntos.En la solución
myList.collect { it.collect { ... } }
, solo estás transformando la propiedadmodel
de cada objetocar
y devolviéndola como una cadena. Por eso obtienes una lista anidada de cadenas.Para actualizar los objetos
Car
originales con la propiedadmodel
modificada, puedes usar el métodoeach
que recorre los elementos de la lista y aplica una transformación a cada elemento sin crear una nueva lista. Entonces, la solución actualizada sería:Aquí, se utiliza
each
dos veces para recorrer cada lista anidada y cada objetoCar
. La propiedadmodel
de cada objetocar
se actualiza en su lugar utilizando el métodoreplace
. La lista originalmyList
se modifica con la propiedadmodel
actualizada de cada objetocar
.