Передача всех членов класса case в метод Java, принимающий переменные аргументы - PullRequest
1 голос
/ 12 марта 2019

Допустим, у меня есть case class CC(a: Int, b: String, c: Double). Для простоты я ограничу это тремя параметрами, но представьте, что у меня есть еще много, скажем, 20. Мой вопрос действительно о более крупном примере.

Теперь у меня есть объект Java SQLServerDataTable, который имеет метод addRow со следующей подписью:

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

Я хочу вызвать addRow со всеми параметрами класса CC, но без необходимости перечислять их все явно:

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.

Ответы [ 2 ]

3 голосов
/ 12 марта 2019

Не тестировал его специально с 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
1 голос
/ 12 марта 2019

Если я вас правильно понимаю, вам нужны значения из класса case в виде коллекции.На самом деле, каждый Scala case class расширяет Product, который предоставляет метод productIterator, который возвращает итератор каждого элемента case class.

Так, может быть, вы просто ищете что-то подобное?

sqlServerDataTable.addRow(cc.productIterator.toList:_*)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...