IT이야기

Scala에서 케이스 클래스를 튜플로 변환하는 쉬운 방법

cyworld 2021. 9. 26. 11:32
반응형

Scala에서 케이스 클래스를 튜플로 변환하는 쉬운 방법이 있습니까?


케이스 클래스를 튜플로 변환하는 쉬운 방법이 있습니까?

물론 이 작업을 수행하기 위해 상용구 코드를 쉽게 작성할 수 있지만 상용구 없이는 의미합니다.

내가 실제로 추구하는 것은 사전순으로 정렬된 케이스 클래스를 쉽게 만드는 방법입니다. scala.math.Ordering.Implicits._를 가져와서 튜플에 대한 목표를 달성할 수 있으며, 짜잔, 내 튜플에는 Ordering이 정의되어 있습니다. 그러나 scala.math.Ordering의 암시는 일반적으로 케이스 클래스에서 작동하지 않습니다.


unapply().get컴패니언 객체를 호출 하는 것은 어떻습니까?

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

val (str, in) = Foo.unapply(Foo("test", 123)).get
// str: String = test
// in: Int = 123

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는 케이스 클래스를 Shapeless HList로 바꿉니다.

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

그리고 HList는 #tupled가 있는 튜플로 변환됩니다.

scala> Fnord(1, "z - last").productElements.tupled
res2: (Int, String) = (1,z - last)

지속적으로 변환하기 때문에 성능이 끔찍할 수 있습니다. 아마도 모든 것을 튜플 형식으로 변환하고 정렬한 다음 와 같은 것을 사용하여 다시 변환할 것 (Fnord.apply _).tupled입니다.


확장되는 ProductNN=1-22에 대해 특성을 확장할 수 있습니다 TupleN. _1, _2, 등과 같은 많은 Tuple 의미 체계를 제공합니다 . 유형을 사용하는 방법에 따라 실제 Tuple을 생성하지 않고도 충분할 수 있습니다.


이 동일한 작업을 시도하는 동안 이 오래된 스레드를 발견했습니다. 나는 결국이 솔루션에 정착했습니다.

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

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

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

ReferenceURL : https://stackoverflow.com/questions/8087958/in-scala-is-there-an-easy-way-to-convert-a-case-class-into-a-tuple

반응형