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
입니다.
확장되는 ProductN
N=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
'IT이야기' 카테고리의 다른 글
Java에서 단일 스레드 복잡한 알고리즘을 측정하기 위한 최고의 매크로 벤치마킹 도구/프레임워크 (0) | 2021.09.27 |
---|---|
XE2에서 COM이 손상되었을때 해결 방법 (0) | 2021.09.27 |
sessionStorage 및 localStorage 저장 장소 (0) | 2021.09.26 |
다중 열 기본 키의 NULL 값 (0) | 2021.09.26 |
SQL Azure에서 데이터베이스 간에 쿼리할 수 없음 (0) | 2021.09.26 |