将案例类的所有成员传递到Java方法,以variadic参数为例



假设我有一个case class CC(a: Int, b: String, c: Double)。为简单起见,我将其限制为3个参数,但想象我还有更多,例如20。我的问题实际上是关于更大的例子。

现在,我有一个带有addRow方法的Java SQLServerDataTable对象,具有以下签名:

public synchronized void addRow(Object... values) throws SQLServerException

我想用CC案例类的所有参数调用addRow,但不必明确列出它们:

val cc = CC(1, "One", 1.0)
sqlServerDataTable.addRow( <some *-like magic with cc goes here> )

而不是:

sqlServerDataTable.addRow(cc.a, cc.b, cc.c)

不仅是因为

sqlServerDataTable.addRow(cc.a, cc.b, cc.d, cc.e, ..., cc.theEnd)

变得乏味,但我也试图找到一种使用addRow的函数的方法。

没有使用Java进行专门测试,但是我认为您需要_*.productIterator的某种组合。以下编译:

case class CC(a: Int, b: String, c: Double)
def addRow(xs: Any*): Unit = xs foreach println // just for demo
val x = CC(123, "123", 1.23)
addRow(x.productIterator.toSeq: _*)

将把x的所有组件传递给addRow一个:

scala> addRow(x.productIterator.toSeq: _*)
123
123
1.23

如果我正确理解您,则需要从案例类中的值作为集合。实际上,每个Scala case class都扩展了Product,它提供了productIterator的方法,该方法返回case class的每个元素的迭代器。

所以也许您只是在寻找这样的东西?

sqlServerDataTable.addRow(cc.productIterator.toList:_*)

相关内容

  • 没有找到相关文章

最新更新