Cast Array<String?> to<String> Array in Kotlin ?



我有一个用字符串初始化的空数组。然后我必须将其传递给需要Array<String>而不是Array<String?>的函数。那么我该如何解决这个问题呢?

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>

我还想提一下,在适配器中更改它只会使事情复杂化,所以我想从这里开始做这一切。

如果您确定您的可空数组中没有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()

要回答您的直接问题,您可以使用以下内容获得一个没有空值的新数组:

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

但是您的代码还有其他问题。没有理由创建空值数组并向其中添加项。每次在循环中调用list_names.plus(item.name)时,您都会创建一个新数组,该数组仍具有原始的 null 值集以及新项目。

相反,您可以直接从要从中获取项的集合中创建非空项列表,并将其转换为 Array:

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

如果您的植物名称可为空,请使用以下命令:

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

不能使用 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) 

相关内容

最新更新