假设我有一个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:_*)