Kotlin 将泛型 Class 转换为地图
Kotlin Convert Genertic Class to Map
有个A Data Class
data class A(val x: String?, val y: Int?)
我必须一二,如果 one
中有空值,则将其替换为 two
的 属性 值,但如果不为空,则保留 one
的价值
val one = A(null, 3)
val two = A("11", 4)
A("11", 3)
我想到的想法是将两个A对象转换为Map,然后合并两个Map
然后将合并的 Map 反序列化为 A
我的问题是
- 合并两个对象有什么好主意吗?(我的情况)
- 如何将通用 Class 转换为地图
inline fun <reified T> toJsonObject(value: T): Map<String, Any> =
objectMapper.readValue(objectMapper.writeValueAsString(value), Map::class.java)
这不起作用请帮助我..
这只有通过反射才有可能:
import kotlin.reflect.full.declaredMembers
inline fun <reified T> T.takeValuesIfNullFrom(item: T): T {
if(this!!::class != item!!::class) return this
val constructor = T::class.constructors.first()
val parameterNames = constructor.parameters.map { parameter -> parameter.name }
val arguments = T::class.declaredMembers
.filter { it.name in parameterNames }
.map { it.call(if (it.call(this) == null) item else this) }
return constructor.call(*arguments.toTypedArray())
}
测试:
data class A(val x: String?, val y: Int?)
val one = A(null, 3)
val two = A("11", 4)
data class B(val x: String?, val y: Int?, val z: Float?)
val three = B(null, 5, null)
val four = B("22", 6, 123.456f)
val resultA = one.takeValuesIfNullFrom(two)
println(resultA)
val resultB = three.takeValuesIfNullFrom(four)
println(resultB)
输出:
A(x=11, y=3)
B(x=22, y=5, z=123.456)
有个A Data Class
data class A(val x: String?, val y: Int?)
我必须一二,如果 one
中有空值,则将其替换为 two
的 属性 值,但如果不为空,则保留 one
的价值
val one = A(null, 3)
val two = A("11", 4)
A("11", 3)
我想到的想法是将两个A对象转换为Map,然后合并两个Map 然后将合并的 Map 反序列化为 A
我的问题是
- 合并两个对象有什么好主意吗?(我的情况)
- 如何将通用 Class 转换为地图
inline fun <reified T> toJsonObject(value: T): Map<String, Any> =
objectMapper.readValue(objectMapper.writeValueAsString(value), Map::class.java)
这不起作用请帮助我..
这只有通过反射才有可能:
import kotlin.reflect.full.declaredMembers
inline fun <reified T> T.takeValuesIfNullFrom(item: T): T {
if(this!!::class != item!!::class) return this
val constructor = T::class.constructors.first()
val parameterNames = constructor.parameters.map { parameter -> parameter.name }
val arguments = T::class.declaredMembers
.filter { it.name in parameterNames }
.map { it.call(if (it.call(this) == null) item else this) }
return constructor.call(*arguments.toTypedArray())
}
测试:
data class A(val x: String?, val y: Int?)
val one = A(null, 3)
val two = A("11", 4)
data class B(val x: String?, val y: Int?, val z: Float?)
val three = B(null, 5, null)
val four = B("22", 6, 123.456f)
val resultA = one.takeValuesIfNullFrom(two)
println(resultA)
val resultB = three.takeValuesIfNullFrom(four)
println(resultB)
输出:
A(x=11, y=3)
B(x=22, y=5, z=123.456)