【问题标题】:Cast Array<String?> to Array<String> in Kotlin?在 Kotlin 中将 Array<String?> 转换为 Array<String>?
【发布时间】:2020-01-09 13:02:25
【问题描述】:

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

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>

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

【问题讨论】:

  • “数组而不是数组”是什么意思?

标签: android kotlin mobile casting


【解决方案1】:

如果您确定没有null-values 将在您的可空数组中,您可以简单地(不安全)强制转换它并且它会起作用,例如:

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

如果你有 null 值,这取决于一点。一种方法是首先过滤掉null-values 并传递结果数组,例如:

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&lt;String&gt; 的最简单和最好的方法,例如:

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

【讨论】:

    【解决方案2】:

    您不能拥有 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) 
    

    【讨论】:

      【解决方案3】:

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

      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()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-12
        • 2019-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-22
        • 2019-11-23
        • 1970-01-01
        相关资源
        最近更新 更多