Kotlin中如何通过associateWith同时过滤空值创建Map?
更简洁的实现方案
你当前的代码里,代码1其实不符合需求——associateWith会保留所有key,哪怕对应的值是null,最终的Map里会存在值为null的条目,没法实现过滤空值的效果。
代码2是可行的,但可以进一步简化,这里提供两种更简洁的写法:
写法1:用mapNotNull结合?.let简化
employeeById.keys.mapNotNull { key -> getEmployeeData()?.let { key to EmployeeReport(it) } }.associate { it }
利用?.let的特性:只有当getEmployeeData()返回非null时,才会生成key和EmployeeReport的键值对,否则返回null;mapNotNull会自动过滤掉这些null值,最后associate直接把键值对集合转成Map。
写法2:用buildMap直观构建
buildMap { employeeById.keys.forEach { key -> getEmployeeData()?.let { put(key, EmployeeReport(it)) } } }
buildMap是Kotlin标准库提供的构建Map的DSL,遍历每个key后,只有当拿到非null的employeeData时,才调用put往Map里添加条目,逻辑直白,不需要额外的集合转换步骤。
这两种写法都比你原来的代码更简洁,同时完美实现「类似associateWith但过滤空值」的需求。
内容的提问来源于stack exchange,提问作者user19320502
相关产品推荐
相关产品推荐

