如何从地图返回带有非null项的listmap?

时间:2017-10-12 23:41:48

标签: kotlin

我有一段代码如下(简化解释问题)。在rawData中,我想过滤掉那些converter中没有提供转换器类型的内容,然后对剩下的内容,将data转换为listitem

data class RawData(val type: String, val data: Data)
interface Converter {
    fun convert(data: Data): ListItem
}

fun transform(): List<ListItem> {
    val providerTypeMap = modelViewProvider.associateBy({it.type}, {it})

    return rawDataList.filter { 
        converter[it.type] != null
    }.map {
        converter[it.type]?.create(it.data) ?: object: ListItem {}
    }
}

注意:我希望返回类型为List<ListItem>而不是List<ListItem?>。为了做到这一点,我需要这一行

converter[it.type]?.create(it.data) ?: object: ListItem {}

??:对我来说非常难看,因为我们已经知道,我们已经过滤并且只保留converter[it.type] != null

我有没有办法摆脱代码中的??: ListItem{}

1 个答案:

答案 0 :(得分:2)

有一个解决方案:

return rawDataList.mapNotNull {
    converter[it.type]?.create(it.data)
}

但我不知道哪个Kotlin版本mapNotNull()方法出现了。如果你没有它,你可以使用构造map {}.filterNotNull()或编写自己的mapNotNull扩展方法。