Присвойте результат этого преобразования с картой переменной с автокастингом - PullRequest
0 голосов
/ 26 января 2019

Я работаю со следующим кодом:

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 голосов
/ 26 января 2019

У меня есть некоторые сомнения по поводу того, как этого добиться, потому что я использую автоматическое вещание.

Примечание: тот факт, что тип может быть выведен из контекста без явного указания егов Котлине называется Smart Cast (не автоматически).


Учитывая, что buildMenuItem и buildItem возвращают 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>.

0 голосов
/ 26 января 2019

Вы можете сделать что-то вроде этого:

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