如何清理地图以返回Map <String,String>而不是Map <String? ,字符串?>在Kotlin中?

时间:2019-09-16 12:14:52

标签: kotlin

我是Kotlin的新手,我想知道我是否可以做这样的事情。

我有一个对象类型为Person的列表

Person具有类似name, id的属性,但可以为空。

所以我做了这样的事情:

return persons.filter {
    it.name != null && it.id != null
  }.map {
    it.id to it.name
  }.toMap()

我个人没有看到该错误,但是编译器不断告诉我应该返回一个非null的映射。

有什么办法可以使用lambdas函数使用filter和map吗?

3 个答案:

答案 0 :(得分:3)

使用mapNotNull组合enumVALUE_C

filter

mappersons.mapNotNull { val id = it.id val name = it.name if (id != null && name != null) Pair(id, name) else null }.toMap() 拉入局部变量应确保在id中将它们推断为非空,但可能没有必要。

您的方法行不通的原因是name仅返回Pair(id, name),无法说出“ persons.filter { ... }的列表具有非空的List<Person>Person”或在编译器内部进行表示。

答案 1 :(得分:3)

顺便说一句,您甚至可以摆脱if中的mapNotNull

persons.mapNotNull {
    val id = it.id ?: return@mapNotNull null
    val name = it.name ?: return@mapNotNull null
    id to name
}.toMap()

答案 2 :(得分:2)

也许您可以简单地更改

.map {
    it.id to it.name
}

进入

.map {
    it.id!! to it.name!!
}

后缀!!会将String?转换为String,如果类型为String?的值是null,则抛出异常。是正确的,因为先前应用了过滤器。 !!的使用应仅限于您负责明确声明该值不能为null的情况:对编译器来说,即使类型为{{1 }--应该谨慎使用imho。 编译器无法根据传递给String的谓词来推断从String?String?的类型域限制,但是您可以,所以我认为String的使用可能是一种有价值的方法...