Cast Array в массив <String>в Kotlin? - PullRequest
1 голос
/ 09 января 2020

У меня есть массив нулей, которые я инициализирую с помощью строк. Затем я должен передать его функции, которая требует Array<String> вместо Array<String?>. Итак, как я могу go обойти эту проблему?

val list_names = arrayOfNulls<String>(plant_list.size)
for(item in plant_list){ list_names.plus(item.name) }

val myListAdapter = MyListAdapter(activity!!,list_names,list_types,list_images) // list_names must be Array<String>

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

Ответы [ 3 ]

1 голос
/ 09 января 2020

Если вы уверены, что в вашем пустом массиве не будет значений null, вы можете просто (небезопасно) привести его, и он будет работать, например:

val myListAdapter = MyListAdapter(activity!!,list_names as Array<String>,list_types,list_images)

Если у вас есть null значения там немного зависит. Один из подходов состоит в том, чтобы сначала отфильтровать null -значения и передать результирующий массив, например:

list_names.filterNotNull().toTypedArray()
// or in case you have different types in there and want only want a single matching one:
list_names.filterIsInstance<String>().toTypedArray()

Но если вы можете: попытайтесь опустить удержание этого массива обнуляемого типа в первую очередь. Разве вы не можете просто отфильтровать нулевые значения и собрать только ненулевые значения? Это, вероятно, самый простой и хороший способ собрать имена как Array<String>, например:

val list_names = plant_list.mapNotNull { it.name }.toTypedArray()
1 голос
/ 09 января 2020

Чтобы ответить на ваш прямой вопрос, вы можете получить новый массив без нулей, используя это:

val nonNullListNames = list_names.filterNotNull().toTypedArray()

Но есть и другие проблемы с вашим кодом. Нет причин создавать массив нулей и добавлять в него элементы. Каждый раз, когда вы вызываете list_names.plus(item.name) в вашем l oop, вы создаете новый массив, в котором все еще есть исходный набор нулевых значений плюс ваш новый элемент (ы).

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

val nonNullNamesArray = plant_list.map { it.name }.toTypedArray()

Если названия ваших заводов допускают обнуление, используйте это:

val nonNullNamesArray = plant_list.mapNotNull { it.name }.toTypedArray()
1 голос
/ 09 января 2020

Вы не можете иметь arrayOfNulls и конвертировать Nullable в объект NonNull. Я рекомендую вам:

val list_names = mutableListOf<String>()
plant_list.foreach {
    list_names.add(it.name)
}
val myListAdapter = MyListAdapter(activity, list_names, list_types, list_images) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...