在 Kotlin 中将 Array<String?> 转换为 Array<String>?

3

我有一个空值数组,我用字符串初始化。然后我必须把它传递给需要 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>

我还想提一下,在适配器中更改它只会使事情变得更加复杂,所以我希望从这里完成所有工作。


"Array instead of Array" 的意思是“使用了错误的数组”。 - Bruno Martins
3个回答

2

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

2

回答您的直接问题,您可以使用以下方法获取没有null值的新数组:

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

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

相反,你可以直接从获取项目的集合中创建一个非空项目列表,并将其转换为数组:

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

如果您的植物名称可为空,请使用以下方法:
val nonNullNamesArray = plant_list.mapNotNull { it.name }.toTypedArray()

1

你不能拥有一个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) 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接