gpt4 book ai didi

scala - 案例类 - 通过转换复制多个字段

转载 作者:行者123 更新时间:2023-12-03 03:20:45 24 4
gpt4 key购买 nike

我有一个包含 25 个字段的案例类,需要将其转换为另一个包含 22 个字段的案例类,其中 19 个是共享的,3 个只是重命名。

我找到了一些如何使用 shapeless 执行此操作的示例(例如 an answer here 以及来自 Miles Sabin herehere 的一些代码示例),但最后一个看起来是有点过时了,而且我无法从 Github 示例中弄清楚如何使用 shapeless 重命名多个字段,或者在将字段添加到新对象之前对字段进行更多操作。谁能帮帮我吗?

简化的代码示例;

import shapeless.LabelledGeneric
case class A(fieldA:Int, fieldB:String, fieldC:String)
case class B(fieldARenamed:Int, fieldB:String, fieldC:String, fieldCTransformed:String)

val aGen = LabelledGeneric[A]
val bGen = LabelledGeneric[B]

val freddie = new A(1,"Freddie","somestring")

val record = aGen.to(freddie)
val atmp = freddie.fieldA
record.Remove("fielda")

val freddieB = bGen.from(record +
(Symbol("fieldARenamed") ->> atmp) +
(Symbol("fieldCTransformed") ->> freddie.fieldC.toUpperCase)
) //Errors everywhere, even if I replace + with :: etc.

我有一种感觉 Align 将会出现在此处的某个地方,但了解如何以尽可能精简的方式做到这一点 - 例如不创建像 Field 这样的额外特征,如上面的第三个链接 - 会很有趣。

The Shapeless Guide ,还有一些单引号的用法(例如 'fieldC)符号,我还没有找到太多信息,所以如果这起作用的话,一些解释也将是真正的有帮助。对于 Scala 魔法的深度来说还相当陌生,所以如果问题看起来很迟钝或涵盖了太多不同的主题,我们深表歉意。

编辑:为了避免疑问,我不是寻找答案,这些答案表明我只是通过引用第一个字段来手动创建一个新的案例类,如下所示;

val freddieB = B(fieldARenamed = freddie.fieldA, fieldB = freddie.fieldB, fieldC = freddie.fieldC, fieldCTransformed =freddie.fieldC.toUpperCase)

请参阅下面的评论,了解为什么这样做不合适的各种原因。

最佳答案

另一种选择是使用 automapper ;特别是Dynamic Mappings功能。

对于您的特定示例,它将如下所示:

import io.bfil.automapper._

case class A(fieldA:Int, fieldB:String, fieldC:String)
case class B(fieldARenamed:Int, fieldB:String, fieldC:String, fieldCTransformed:String)

val freddie = new A(1,"Freddie","somestring")

val freddieB = automap(freddie).dynamicallyTo[B](
fieldARenamed = freddie.fieldA,
fieldCTransformed = freddie.fieldC.toUpperCase
)

我想你可以把它变成一个函数

def atob(a: A): B = {
automap(a).dynamicallyTo[B](
fieldARenamed = a.fieldA,
fieldCTransformed = a.fieldC.toUpperCase
)
}

从效率的角度来看,这个lib使用了宏,所以generated code几乎与手写一样好

关于scala - 案例类 - 通过转换复制多个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56320289/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com