2017-10-12 35 views
0

我有一段代码如下(简化来解释问题)。从RAWDATA,我想过滤掉那些不具有converter A转换器类型,然后对剩余的,转换datalistitem如何从地图返回非空项目的列表映射?

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

回答

2

有一个解决方案:

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

但我不知道在哪个科特林的版本mapNotNull()方法出现。如果你没有它,你可以使用建设map {}.filterNotNull()或写你自己的mapNotNull扩展方法。

+0

我会为我的公关获得一个红色标记:P – Elye

+0

我编辑了答案。核实。 –

+0

不错的@Alexandr – Elye

相关问题