有没有一种简单的方法可以将案例类转换为元组?
当然,我可以轻松编写样板代码来执行此操作,但我的意思是没有样板文件。
我真正想要的是一种轻松地按字典顺序对案例类进行排序的方法。我可以通过导入scala.math.Ordering.Implicits._来实现元组的目标,瞧,我的元组为它们定义了一个Ordering。但是scala.math.Ordering中的含义一般不适用于案例类。
答案 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) }