通过自动转换将映射的转换结果分配给变量

时间:2019-01-25 21:44:31

标签: collections kotlin transformation

我正在使用下一个代码:

private fun buildItemsList(navMenu: NavMenu?, appName: String): MutableList<Item> {
        val items: MutableList<Item> = arrayListOf()
        navMenu?.items?.map { item ->
            when (item) {
                is NavMenu -> items.add(buildMenuItem(item, appName))
                is NavLink -> items.add(buildItem(item, appName))
                else -> throw IllegalStateException("Unknown subtype ${item::class.simpleName} of NavMenu")
            }
        }
        return items
    }

我应该能够将结果分配给项目,而不是添加到项目列表中。根据:https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/map.html

类似的东西:

val items = navMenu?.items?.map { }

我对如何实现此目标有一些疑问,因为我正在使用自动广播(何时)。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

private fun buildItemsList(navMenu: NavMenu?, appName: String): List<Item> {
    if (navMenu == null || navMenu!!.items == null) {
        return emptyList()
    }
    return navMenu!!.items!!.map { item ->
            when (item) {
                is NavMenu -> buildMenuItem(item, appName)
                is NavLink -> buildItem(item, appName)
                else -> throw IllegalStateException("Unknown subtype ${item::class.simpleName} of NavMenu")
            }
        }
}

OR

private fun buildItemsList(navMenu: NavMenu?, appName: String): List<Item> {
    if (navMenu == null || navMenu!!.items == null) {
        return emptyList()
    }
    return navMenu!!.items!!.filter { it is NavMenu }.map { buildMenuItem(it as NavMenu, appName) } +
           navMenu!!.items!!.filter { it is NavLink }.map { buildItem(it as NavLink, appName) }
}

答案 1 :(得分:0)

  

我对如何实现这一目标有一些疑问,因为我正在使用   自动广播。

注意:在Kotlin中,可以在不显式指定的情况下从上下文推断类型的事实称为Smart Cast(不是自动转换)。


鉴于buildMenuItembuildItem返回Item,您可以执行以下操作:

private fun buildItemsList(navMenu: NavMenu?, appName: String) = navMenu?.items?.map { item ->
    when (item) {
        is NavMenu -> buildMenuItem(item, appName)
        is NavLink -> buildItem(item, appName)
        else -> throw IllegalStateException("Unknown subtype ${item::class.simpleName} of NavMenu")
    }
} ?: emptyList()

推断的返回类型将为List<Item>。如果您需要可变列表,请添加一个toMutableList()调用。


如果您需要使用filterIsInstance分别过滤类型,则是个好主意。

用法:

val l = listOf(1, 2, "Hello").filterIsInstance<String>()

l的类型为List<String>