Java 如何调用数组的vararg方法?
我在jooqapi中发现了一个奇怪的方法Java 如何调用数组的vararg方法?,java,jooq,Java,Jooq,我在jooqapi中发现了一个奇怪的方法 Batch batch(Query query, Object[]... bindings); 我很好奇如何在不手动指定参数的情况下调用它 public int g(Object[]... args) { return args.length; } 失败: assertEquals(2, g(new Object[] { new Object[0], new Object[0] })); 测试失败,因为Java隐式地为三点符号创建了一个数组
Batch batch(Query query, Object[]... bindings);
我很好奇如何在不手动指定参数的情况下调用它
public int g(Object[]... args) {
return args.length;
}
失败:
assertEquals(2, g(new Object[] { new Object[0], new Object[0] }));
测试失败,因为Java隐式地为三点符号创建了一个数组。在您的例子中,方法g获得一个包含一个元素的数组,该数组的第一个元素也是一个数组(您的数组包含两个
对象的实例)
因此,您可以省略额外的数组:
assertEquals(2, g(new Object[0], new Object[0]));
因此,您可以使用batch()
方法,只需通过显式数组传递vararg参数:
batch(query, new Object(), new Object())
API是什么意思?
API的目的是以矩阵形式为批处理语句提供一组绑定值,其中每个外部数组元素对应于批处理中的单个语句,每个内部数组元素对应于一个绑定值
它叫什么名字?
有几种方法。让我们在这里假设这个查询:
Query query = DSL.query("INSERT INTO t(a, b) VALUES (?, ?)", null, null);
例如,使用Java中的经典矩阵创建(varargs在这里没有帮助):
或者,通过使用单个数组(这是varargs可能提供帮助的地方):
如果您有一些预先存在的jOOQ记录结构,并且希望将它们作为绑定变量传递给批处理,则后者尤其有用,例如,通过使用:
如果问题正确,则需要Object[]
s作为batch
的参数,而不是Object
s。
batch(query, new Object[][] {
{ 1, "a" }, // Record 1 to insert
{ 2, "b" }, // Record 2 to insert
{ 3, "c" } // Record 3 to insert
});
batch(query,
new Object[] { 1, "a" }, // Record 1 to insert
new Object[] { 2, "b" }, // Record 2 to insert
new Object[] { 3, "c" } // Record 3 to insert
);
batch(query,
record1.intoArray(),
record2.intoArray(),
record3.intoArray()
);