在Scala中,有一种简单的方法可以将案例类转换为元组吗?

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)

  • 感谢提示,在REPL 2.9.0-1我不得不删除()到"获取" (5认同)
  • 您无法在新的Scala版本中调用`get()`,而只能调用`get` (2认同)

Tai*_*aig 6

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)


Jam*_*ore 5

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