我有两个班级
case class A (field1: String, field2: Int)
class B {var myField1: String, var myField2: String}
(事实上有很多领域,但我只使用了2个)
我需要从A
转换为B
并返回。
目前我有两种方法,分配很多。
有没有办法在这些字段之间描述一次映射?
我查看Lens
但尚未找到解决此问题的方法。
看起来很常见,所以我相信有标准的解决方案。
答案 0 :(得分:5)
我认为您正在寻找Isomorphism。
Monocle提供以下内容:
val AtoB = Iso[A, B]((a: A) => new B(a.field1, p.field2))((B: B) => A(p.myField1, b.myField2))
val myB:B = AtoB.get(A("one", 1))
val myA:A = AtoB.reverseGet(myB)
中有更多示例
答案 1 :(得分:0)
没有
您可以使用implicits
和implicit classes
来简化不同类的使用。
case class ExampleA (field1: String, field2: Int)
class ExampleB(var myField1: String, var myField2: String)
implicit def aToB(in: ExampleA) : ExampleB = new ExampleB(in.field1, in.field2.toString)
implicit def bToA(in: ExampleB) : ExampleA = ExampleA(in.myField1, in.myField2.toInt)
def functionThatWorksWith_A_And_B[A <% ExampleA](in: A) : Int = in.field2
-
scala> functionThatWorksWith_A_And_B( new ExampleB("exampleB", "99"))
res5: Int = 99
scala> functionThatWorksWith_A_And_B(ExampleA("exampleA", 5))
res6: Int = 5