两种类型之间的双向转换

时间:2015-12-22 14:14:40

标签: scala

我有两个班级

case class A (field1: String, field2: Int)

class B {var myField1: String, var myField2: String}

(事实上有很多领域,但我只使用了2个)

我需要从A转换为B并返回。 目前我有两种方法,分配很多。

有没有办法在这些字段之间描述一次映射? 我查看Lens但尚未找到解决此问题的方法。

看起来很常见,所以我相信有标准的解决方案。

2 个答案:

答案 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)

monocle docs

中有更多示例

答案 1 :(得分:0)

没有

您可以使用implicitsimplicit 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