Для такого рода проблем, пожалуйста, рассмотрите возможность использования класс типов .
import scala.collection.immutable.ArraySeq
trait TableEncoder[T] {
def header: ArraySeq[String]
def asRow(t: T): ArraySeq[String]
}
object TableEncoder {
def toTable[T](data: IterableOnce[T])
(implicit encoder: TableEncoder[T]): ArraySeq[ArraySeq[String]] = {
val builder = ArraySeq.newBuilder[ArraySeq[String]]
builder.addOne(encoder.header)
builder.addAll(data.iterator.map(encoder.asRow))
builder.result()
}
}
, который вы можете использовать так:
final case class Point(x: Int, y: Int)
object Point {
final implicit val PointTableEncoder: TableEncoder[Point] =
new TableEncoder[Point] {
override val header: ArraySeq[String] =
ArraySeq("x", "y")
override def asRow(point: Point): ArraySeq[String] =
ArraySeq(
point.x.toString,
point.y.toString
)
}
}
TableEncoder.toTable(List(Point(1, 2), Point(3, 3)))
// res: ArraySeq[ArraySeq[String]] = ArraySeq(
// ArraySeq("x", "y"),
// ArraySeq("1", "2"),
// ArraySeq("3", "3")
// )