Dou*_*las 55 scala tuples case-class
有没有一种简单的方法将案例类转换为元组?
当然,我可以轻松编写样板代码来执行此操作,但我的意思是没有样板.
我真正想要的是一种轻松地按字典顺序编写案例类的方法.我可以通过导入scala.math.Ordering.Implicits._来实现元组的目标,瞧,我的元组有一个为它们定义的Ordering.但scala.math.Ordering中的含义一般不适用于案例类.
S-C*_*S-C 76
如何调用unapply().get伴侣对象?
case class Foo(foo: String, bar: Int)
val (str, in) = Foo.unapply(Foo("test", 123)).get
// str: String = test
// in: Int = 123
Run Code Online (Sandbox Code Playgroud)
Scala 3 对案例类和元组之间的转换提供一流的支持:
scala> case class Foo(foo: String, bar: Int)
// defined case class Foo
scala> Tuple.fromProductTyped(Foo("a string", 1))
val res0: (String, Int) = (a string,1)
scala> summon[deriving.Mirror.ProductOf[Foo]].fromProduct(res0)
val res1: deriving.Mirror.ProductOf[Foo]#MirroredMonoType = Foo(a string,1)
Run Code Online (Sandbox Code Playgroud)
Shapeless将为您做到这一点。
import shapeless._
import shapeless.syntax.std.product._
case class Fnord(a: Int, b: String)
List(Fnord(1, "z - last"), Fnord(1, "a - first")).sortBy(_.productElements.tupled)
Run Code Online (Sandbox Code Playgroud)
得到
res0: List[Fnord] = List(Fnord(1,a - first), Fnord(1,z - last))
Run Code Online (Sandbox Code Playgroud)
productElements将案例类转换为Shapeless HList:
scala> Fnord(1, "z - last").productElements
res1: Int :: String :: shapeless.HNil = 1 :: z - last :: HNil
Run Code Online (Sandbox Code Playgroud)
HLists通过#tupled转换为元组:
scala> Fnord(1, "z - last").productElements.tupled
res2: (Int, String) = (1,z - last)
Run Code Online (Sandbox Code Playgroud)
由于您不断转换,因此性能可能会很糟糕。您可能会将所有内容转换为元组形式,对其进行排序,然后使用类似的形式将其转换回(Fnord.apply _).tupled。
| 归档时间: |
|
| 查看次数: |
12451 次 |
| 最近记录: |