Kann jemand zwei Datensätze ausrichten, wenn sie denselben Namen haben wie Felder, aber nicht die gleichen Werte, die in Spalte eingeschlossen sind, eine andere Option, die ich ausrichten muss die Reihenfolge ist andersFormlose Ausrichtung mit verschiedenen Typen, aber gleichen Beschriftungen
import shapeless._
import shapeless.labelled.{FieldType, field}
import shapeless.ops.hlist.{Align, ToTraversable, ZipWith}
object ShapelessTest {
def zipClasses[A, B, P <: Poly2, ARepr <: HList, BRepr <: HList, R <: HList, X]
(a: A, b: B, f: P)(
implicit
aGen : LabelledGeneric.Aux[A, ARepr],
bGen : LabelledGeneric.Aux[B, BRepr],
// align : Align[ARepr, BRepr],
zipWith : ZipWith.Aux[ARepr, BRepr, P, R],
toTrav: ToTraversable.Aux[R, List, X]
): List[X] =
aGen.to(a).zipWith(bGen.to(b))(f).toList
// align.apply(aGen.to(a)).zipWith(bGen.to(b))(f).toList
def main(args: Array[String]): Unit = {
case class Column[A](value: A)
case class DTable(id: Column[Long], s2: Column[Int], s: Column[String])
case class DFilter(id: Option[Long], s: Option[String], s2: Option[Int])
object filter extends Poly2 {
implicit def repr[K <: Symbol, V] = at[FieldType[K, Column[V]], FieldType[K, Option[V]]] { (a, b) =>
field[K]((a, b).asInstanceOf[(Any, Any)])
}
}
val dTable = new DTable(Column(1L), Column(3), Column("s"))
val dFilter = new DFilter(Option(222L), Option("second"), Option(234))
// def filter[A](col: Column[A], filterCriteria: Option[A]): Option[Boolean] = ???
// def filterClass(table: DTable, filter: DFilter): List[Option[Boolean]] = ???
def filterClass(t: DTable, f: DFilter): List[(Any, Any)] = zipClasses(t, f, filter)
val res = filterClass(dTable, dFilter)
println(res)
}
}
ich zwei Datensätze mit genau dem gleichen Typ ausrichten kann, und ich kann mit zwei Aufzeichnungen sogar zipWith tun, wenn der Typ nicht einen exakt ist, aber sie müssen durch Tasten ausgerichtet werden.
Danke
Sie Dmytro danken – user1698641