在 Kotlin 中将一个对象转换为另一个对象的更好方法是啥?
Posted
技术标签:
【中文标题】在 Kotlin 中将一个对象转换为另一个对象的更好方法是啥?【英文标题】:What is the better way to transform one object to another in Kotlin?在 Kotlin 中将一个对象转换为另一个对象的更好方法是什么? 【发布时间】:2020-01-10 10:51:38 【问题描述】:我的项目中有多个对象类,我需要将一个对象转换为另一个对象。
我尝试创建一个通用工具并开始转换它们,代码开始增长并且无法在单个文件中进行管理。
然后我开始创建类似于此的个人transformer
类,
/** This transforms [Square] to [Rectangle] **/
object SquareToRectangleTransformer
fun transform(square: Square): Rectangle
checkNotNull(square.side) missing ("side")
val length = square.side
val breadth = square.side
return Rectangle(length, breadth
现在我的项目有多个类似于上述的转换器类,现在我发现这种方法是一种反模式,因为它会产生类爆炸问题。
我搜索了其他替代方案,例如插件或依赖库,它们可以用更少的代码和源代码为我完成这项工作this answer interesting。
Kotlin 中是否有任何类似的库可以为我完成这项工作?
【问题讨论】:
【参考方案1】:让 Rinat Suleimanov 回答我使用扩展程序所做的事情
data class SquareResponse(val side: Int, name: String)
data class SquareEntity(val side: Int, name: String)
// transforms a single object
fun SquareResponse.transform(): SquareEntity
this.apply
return SquareEntity(
side, name
)
// transforming lists
fun List<SquareResponse>.transform(): List<SquareEntity>
return this.map
it.transform()
// Example use
fun listTransform(squares: List<SquareResponse>): List<SquareEntity>
return squares.transform()
fun singleTranform(squar: SquareResponse): SquareEntity
return square.transform()
【讨论】:
【参考方案2】:在我的项目中,我们也面临同样的问题,我们必须将一个对象转换为另一个对象。因此,我们采用了这种方法,我们添加了一个 from()
方法作为伴随对象。例如,如果我想将正方形转换为矩形,我就写Rectangle.from(square)
class Rectangle()
companion object
fun from(square: Square): Reactangle
return Rectangle(square.side,square.side)
有了这个,我们可以将一个对象转换成其他对象,同时也让你的代码更干净。
【讨论】:
【参考方案3】:我建议您为要进行的每个转换创建一个扩展函数。对我来说,这是非常清晰和好的方式。几乎所有的 kotlin 标准库都以相同的方式编写。示例:
fun Square.transform(): Rectangle
val length = square.side
val breadth = square.side
return Rectangle(length, breadth)
您可以将此函数作为成员函数调用:
val square = Square(4)
val rectangle = square.transform()
你也可以避免checkNotNull(square.side) missing ("side")
,如果你做了类型,表示侧不可为空:
data class Square(
val side: Int
)
【讨论】:
以上是关于在 Kotlin 中将一个对象转换为另一个对象的更好方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Kotlin Android 中将字符串转换为 JSON 对象 [重复]