I have a kotlin object defined as such:

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
}

这很好,所以我遇到的问题是,属性是可以为空的,当我访问一个属性时,比如说,如果在映射中没有设置该属性,那么执行instance.email就会抛出NoSuchElementException.

Instead, it'd be more convenient if it returned null, since it's optional/nullable. Is there any way to achieve this without writing my own delegate?

推荐答案

您基本上可以使用包装Map进行委托的.withDefault { ... }扩展,以便它执行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
}

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

Kotlin相关问答推荐

如果启用了Flyway迁移,则不能具有配置属性';datources.default.架构-生成

同时也是一个字符串的 Kotlin 枚举

如何将消费者放入 Kotlin 的 map 中?

有没有什么方法或算法可以在没有存储的情况下生成唯一的随机数?

为什么 Kotlin 在将协变类型参数转换为不变类型参数时会产生 Unchecked Cast 警告?

在 kotlin 中重载函数时,我在一些非常基本的代码上不断收到类型不匹配

使用 LazyListScope 嵌套可组合项

如何从 kotlin 函数中 Select 正确的枚举值

为什么 Kotlin 扩展运算符在传递原始可变参数时需要 toTypedArray()?

无法解决:androidx.lifecycle:lifecycle-viewmodel-ktx:1.1.1

Kotlin通过映射委托属性,如果映射中不存在,则抛出NoTouchElementException

生成Kotlin类图

修改扩展函数中的this

Kotlin中保留的关键字是什么?

Kotlin数据类打包

uses-sdk:minSdkVersion 16 不能小于库中声明的版本 23

Kotlin-将UTC转换为当地时间

如何根据ArrayList的对象属性值从中获取最小/最大值?

Kotlin:测试中的 java.lang.NoSuchMethodError

Dagger 2 androidx fragment不兼容类型