Почему .map в mutableList фактически не изменяет значения внутри List в Kotlin?

Это то, что у меня есть и чего я хочу достичь:

  1. У меня есть класс, который имеет mutableList как поле.

  2. Я хочу найти определенный элемент внутри этого списка и изменить его.

Это то, что я пробовал до сих пор:

  1. Это функциональное заявление, на которое я надеялся работать, после того как я включил его в функцию расширения:

     fun Classroom.setNewParameters(id: String, modifiedName: String) { this.students.filter { l -> l.id == id } .map { l -> l.name = modifiedName } .toList() } 

    Но после того, как эта функция вызывается, список students не меняется.

  2. Я нашел «уродливое» решение с кодом ниже:

     fun Classroom.setNewParameters(id: String, modifiedName: String) { for (l : Student in this.students) { if (l.id == id) { l.name = modifiedName break } } } 

Тем не менее, мне очень хотелось бы знать, почему первый блок кода ведет себя так, как он есть, и фактически не влияет на список.

Вы можете представить map как способ преобразования ввода для получения нового вывода. Обычно он не должен мутировать состояние внутри, другими словами, он должен быть функцией без побочных эффектов для обеспечения ремонтопригодности

В вашем случае вы явно хотите мутировать элементы, для чего вы можете использовать этот фрагмент кода:

 fun Classroom.setNewParameters(id: String, modifiedName: String) { this.students.filter { l -> l.id == id } .onEach { l -> l.name = modifiedName } } 

Кроме того, даже если вы неправильно использовали map она должна изменить поле l.name (если вы не внедрили свои собственные делегаты или getter / setter). Попробуйте отладить установленную this.students.filter { l -> l.id == id } останова на this.students.filter { l -> l.id == id } и посмотреть, есть ли какие-либо элементы, оставшиеся после фильтрации

Noob здесь, но я только что видел кое-что, связанное с этим на днях.

Есть ли причина, по которой вы не просто проверили бы, будет ли ваш массив содержать старое значение, вернуть идентификатор элемента, а затем присвоить новое значение этому идентификатору?

Наверное, я просто указываю, что это может быть выполнено с помощью поиска типа «значение в массиве» … но я все еще слишком новичок, чтобы узнать о плюсах и минусах использования его против карты.

Вид вроде этого ниже, который я получил от Kotlin – Идиоматический способ проверки массива содержит значение


«значение» в массиве

Что переводится в Java API:

array.contains ( "значение")


Поэтому я бы посмотрел на старое значение в массиве, вернул его индекс и переназначил этот индекс новым значением.

Intereting Posts
Ассоциированная сертификация разработчика Android mockito InjectMocks не работает? Какова основная разница между сбросом и сокращением в Котлине? Когда использовать какой? Чтение файла Kotlin, использование блока, не перехватывающего все исключения Robolectric addResolveInfoForIntent не работает Передача массива Parcelable с использованием Intent.putExtra Как внедрить DSLконтекст JOOQ в классе Kotlin Android Studio показывает ошибки в layout.xml Путаница в Int :: class.java.isInstance () в Котлине Невозможно сделать API-адрес urlfetch.Fetch в потоке, который не является ни потоком исходного запроса, ни потоком, созданным ThreadManager Использование класса Kotlin в Java: не удается найти символ Функцию можно написать в Котлине (т.е. на верхнем уровне). Могу ли я также тестировать те, кто находится на верхнем уровне? Настройка Kotlin в новом проекте Android Studio Я хочу определить, является ли класс JVM классом Котлина или нет Как предотвратить загрузку в режиме «Создание фрагмента» перед Java?