如果地图中不存在,Kotlin通过地图委托属性抛出NoSuchElementException

arg*_*g20 8 kotlin

我有一个kotlin对象定义如下:

data class UserUpdateRequest(val map: Map<String, Any?>) {
    @get:Email
    val email: String? by map
    val firstName: String? by map
    val lastName: String? by map
}
Run Code Online (Sandbox Code Playgroud)

因此工作正常,所以我遇到的问题是属性可以为空,当我访问一个时,通过这样做instance.email会抛出一个NoSuchElementExceptionif if属性未在地图中设置.

相反,如果返回它会更方便null,因为它是可选的/可空的.有没有办法在不编写自己的代表的情况下实现这一目标?

hot*_*key 13

您基本上可以使用.withDefault { ... }包装Mapfor委托的扩展,以便它执行lambda来计算缺少键的值:

data class UserUpdateRequest(val map: Map<String, Any?>) {
    private val defaultMap = map.withDefault { null }

    @get:Email
    val email: String? by defaultMap
    val firstName: String? by defaultMap
    val lastName: String? by defaultMap
}
Run Code Online (Sandbox Code Playgroud)

请注意,此包装器不处理简单defaultMap.get(key)defaultMap[key]查询,它只影响defaulMap.getValue(key)调用(委托实现也恰好使用它).