#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» — это именно то, что мне нужно! @Джоффри — Хорошая мысль о посте . нравится. Меня уже ловили на этом раньше)