在 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 中将一个对象转换为另一个对象的更好方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Objective-C 中将对象类型转换为另一个类

如何在 C# 中将对象数组向上转换为另一种类型的对象数组?

如何在 Kotlin Android 中将字符串转换为 JSON 对象 [重复]

如何通过元素的属性将集合转换/转换为另一个集合?

如何在javascript中将对象数组过滤为另一个对象数组? [关闭]

java编程:输入一个字符串,将其转换为另一个字符串。