Преобразование ArrayMap в ArrayList — Kotlin

У меня есть ArrayMap, и мне нужен список чатов для создания и повторного просмотра.

val chats : ArrayMap<String,Chat>? = ArrayMap()

RecyclerView.Адаптер

class ChatAdapter(var chats : ArrayList<Chat>){
   .
   .
   .
}

Я получаю этот ArrayMap от firebase. Каков наилучший способ получить ArrayList?


person Beto Caldas    schedule 03.07.2017    source источник


Ответы (2)


Вы не должны использовать ArrayList в общедоступном конструкторе (потому что тогда вы зависите именно от этой реализации). Должен быть интерфейс MutableList:

class ChatAdapter(var chats : MutableList<Chat>){

Я предполагаю, что ArrayMap - это обычный Map (потому что я не знаю этого класса). Вы можете просто написать

val chats : ArrayMap<String,Chat>? = ArrayMap()
// ... initialize the chat
val adapter = ChatAdapter(am.values.toMutableList())

Если вам по какой-то причине действительно нужен класс ArrayList, вы можете написать

val adapter = ChatAdapter(ArrayList(am.values))
person guenhter    schedule 03.07.2017
comment
Я не могу этого понять. Вы не должны использовать ArrayList в общедоступном конструкторе (потому что тогда вы зависите именно от этой реализации). Но ваше второе решение работает: val adapter = ChatAdapter(ArrayList(am.values)) - person Beto Caldas; 03.07.2017
comment
Я нашел другое решение: ChatAdapter(user.chats.map {it.value} as ArrayList‹Chat›) - person Beto Caldas; 03.07.2017
comment
ArrayList — это реализация, MutableList — интерфейс. Если возможно, всегда используйте интерфейс, например. в вашем случае используйте интерфейс в конструкторе. Потому что тогда вы можете передать ЛЮБУЮ реализацию (как ArrayList) в свой ChatAdapter. В противном случае вы можете просто передать ArrayList. - person guenhter; 03.07.2017
comment
Я бы не стал использовать user.chats.map { it.value } в качестве ArrayList‹Chat›, потому что у него гораздо больше накладных расходов во время выполнения, чем у ArrayList(am.values) - person guenhter; 03.07.2017
comment
Я изменил его на ваше второе решение. Я нашел этот пост о том, что вы говорите: stackoverflow.com/a/43116238/1593067 Это ваша точка зрения? - person Beto Caldas; 03.07.2017
comment
Да, это описывает это довольно хорошо. - person guenhter; 03.07.2017
comment
Давайте продолжим обсуждение в чате. - person guenhter; 03.07.2017

Если вам явно не нужен ArrayList, вы можете использовать функцию ArrayMap.map() следующим образом:

val chats : ArrayMap<String,Chat>? = ArrayMap()
val list : List<Chat> = chats.map { it.value }
person dedda1994    schedule 06.07.2017
comment
Я прокомментировал это в проверенном решении. - person Beto Caldas; 06.07.2017
comment
Спасибо. Я уже думал, что это может быть дороже во время выполнения, но не был уверен, поэтому я подумал, что не помешает увидеть другой возможный способ. По крайней мере, это не совсем неправильно, я думаю. - person dedda1994; 07.07.2017