Как я могу изменить поле объекта в списке и вернуть список с измененным объектом?

#kotlin #arraylist

Вопрос:

У меня есть сообщение класса данных:

 data class Post(  val id: Long,  val author: String,  val content: String,  val published: String,  var likedByMe: Boolean,  var likes: Int = 0 )  

А вот список объектов этого класса:

 val post1 = Post(id = 1, "First", "Content", "0", false, 0) val post2 = Post(id = 2, "Second", "Interesting", "0", false, 0) val post3 = Post(id = 3, "Third", "Nothing", "0", false, 0)  val postsList = mutableListOflt;Postgt;(post1, post2, post3)  

Мне нужно увеличить количество лайков для первого поста и вернуть обновленный список (например, распечатать его). Как я могу это сделать, скажите мне, пожалуйста?

P.S. Я думаю, что это можно как-то реализовать с помощью цепочки функций расширения, таких как фильтр, карта и т.д., Но я не понимаю, как это сделать.

Ответ №1:

Чтобы мутировать, как в пост1:

 postsList[0].likes  = 1  

Чтобы изменить лайки post1 и вернуть новый список:

 val newList = postsList  .mapIndexed { index, post -gt;  if (index == 0)   post.likes  post // return mutated post1  }  

Чтобы клонировать post1, а затем изменить его лайки (тем самым оставив post1 без изменений) и вернуть новый список:

 val newList = postsList  .mapIndexed { index, post -gt;  if (index == 0) post.copy(likes = post.likes   1) // return mutated clone  else post // return non-mutated posts  }  

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

Исправления, сделанные в соответствии с первым комментарием @Joffrey.

Комментарии:

1. В последнем примере post.likes должно быть post.like 1 , если вы не хотите изменять исходное сообщение. Кроме того, post.likes фактически вычисляется предыдущее значение, а это не то, что вам здесь нужно. Поэтому, если вы хотите изменить оригинал И вернуть значение 1, так и должно быть post.likes .

2. @Джоффри: Большое вам спасибо. Внесла изменения.

3. @Джоффри: Я вдруг не уверен, действительно ли второму примеру нужна префиксная версия, так как post.likes даст тот же результат, что и post.likes, не так ли? Последняя строка с сообщением актуальна для нового списка.

4. Действительно, во втором примере это не имеет значения, потому что значение выражения приращения не используется

5. Спасибо вам, ребята! lukas.j — Второй вариант с использованием «mapindexed» — это именно то, что мне нужно! @Джоффри — Хорошая мысль о посте . нравится. Меня уже ловили на этом раньше)