C'est ce que j'ai et ce que je veux atteindre:Pourquoi .map sur un mutableList ne change pas réellement les valeurs dans List dans Kotlin?
J'ai une classe qui a un
mutableList
comme un champ.Je souhaite trouver un élément spécifique dans cette liste et le modifier.
C'est ce que je l'ai essayé jusqu'à présent:
Ceci est la déclaration fonctionnelle j'espérais aurait travaillé, après que je l'ai aussi mis dans une fonction d'extension:
fun Classroom.setNewParameters(id: String, modifiedName: String) { this.students.filter { l -> l.id == id } .map { l -> l.name = modifiedName } .toList() }
Mais la liste
students
semble être inchangée après l'appel de cette fonction.J'ai trouvé une solution « laid » avec le code ci-dessous:
fun Classroom.setNewParameters(id: String, modifiedName: String) { for (l : Student in this.students) { if (l.id == id) { l.name = modifiedName break } } }
encore THO, je voudrais vraiment savoir pourquoi le premier bloc de code se comporte comme il le fait et n » Je n'ai aucun effet sur la liste.
Je ne peux pas reproduire (mais vous abusez sérieusement de map(): il n'y a aucune raison de créer une nouvelle liste juste pour muter un des éléments de la liste originale). https://gist.github.com/jnizet/a25b87ff33ca156f446adbc8d6548bac. Publiez un programme minimal complet reproduisant votre problème. –
@JBNizet ouais tu as raison ce n'était pas du tout cool. Je ne sais pas pourquoi je suis coincé avec le .map (le cas réel est un peu plus complexe mais n'a toujours pas de sens pour utiliser .map). J'ai posté une bonne réponse ci-dessous mais il l'a effacée, de toute façon il m'a juste dit d'aller avec 'students.forEach ({if (it.id == id) it.name = modifiedName})' et ça semble marcher très bien ! Pensez-vous que c'est une bonne solution aussi? –
Non. Je pense que vous devriez plutôt utiliser 'list.find {it.id == id} ?. name = modifiedName'. C'est ce qui correspond à votre deuxième extrait: trouvez l'élément * first * avec l'identifiant donné, et changez son nom. –