簡體   English   中英

通過自動轉換將映射的轉換結果分配給變量

[英]Assign the result of this transformation with map to a variable with autocasting

我正在使用下一個代碼:

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 { }

我對如何實現此目標有一些疑問,因為我正在使用自動廣播(何時)。 有任何想法嗎?

您可以執行以下操作:

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")
            }
        }
}

要么

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

我對如何實現此目標有一些疑問,因為我正在使用自動廣播。

注意:無需明確指定即可從上下文中推斷出類型的事實在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>類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM