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

时间:2011-11-10 23:42:53

标签: scala tuples case-class

有没有一种简单的方法可以将案例类转换为元组?

当然,我可以轻松编写样板代码来执行此操作,但我的意思是没有样板文件。

我真正想要的是一种轻松地按字典顺序对案例类进行排序的方法。我可以通过导入scala.math.Ordering.Implicits._来实现元组的目标,瞧,我的元组为它们定义了一个Ordering。但是scala.math.Ordering中的含义一般不适用于案例类。

4 个答案:

答案 0 :(得分:69)

如何在随播对象中调用unapply().get()

case class Foo(foo:String, bar:Int)

val (str, in) =  Foo.unapply(Foo("test", 123)).get()

答案 1 :(得分:3)

您可以尝试扩展ProductN特征,对于N = 1-22,TupleN扩展。它将为您提供许多Tuple语义,如_1_2等方法。根据您使用类型的方式,如果不创建实际的元组,这可能就足够了。

答案 2 :(得分:3)

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)

获取

res0: List[Fnord] = List(Fnord(1,a - first), Fnord(1,z - last))

productElements将case类转换为Shapeless HList:

scala> Fnord(1, "z - last").productElements
res1: Int :: String :: shapeless.HNil = 1 :: z - last :: HNil

使用#tupled:

将HLists转换为元组
scala> Fnord(1, "z - last").productElements.tupled
res2: (Int, String) = (1,z - last)

性能可能很糟糕,因为你经常转换。您可能会将所有内容转换为tupled表单,对其进行排序,然后使用(Fnord.apply _).tupled之类的内容将其转换回来。

答案 3 :(得分:1)

尝试做同样的事情时遇到了这个旧线程。我最终确定了这个解决方案:

case class Foo(foo: String, bar: Int)

val testFoo = Foo("a string", 1)

val (str, in) = testFoo match { case Foo(f, b) => (f, b) }