提问人:Jacob Birkett 提问时间:7/2/2017 最后编辑:Jason AllerJacob Birkett 更新时间:8/7/2020 访问量:2150
将数组分散为函数的多个参数
Spread an array into multiple arguments for a function
问:
如何在 Java 中将数组作为三个参数传递给函数?(请原谅我,我是 Java 的新手)。
我有以下函数作为参数。float r, float g, float b, float a
renderer.prepare(r, g, b, 1);
我想将此函数的输出传入。(或者弄清楚如何返回三个单独的未包装浮子)。
public static float[] rgbToFloat(int r, int g, int b) {
return new float[] {(float) r / 255f, (float) g / 255f, (float) b / 255f};
}
我该怎么做?在其他一些语言中,它看起来像这样:
renderer.prepare(...rgbToFloat(25, 60, 245), 1);
答:
也许原来的问题迟到了,可能会帮助迟到的读者在这里绊倒(像我一样):我宁愿建议只将一个参数转换为浮点:
public static float rgbToFloat(int value)
{
return value / 255.0f;
// don't need the cast, value will be promoted to float anyway
// as second parameter is already
}
现在打电话到
renderer.prepare(rgbToFloat(25), rgbToFloat(60), rgbToFloat(245), 1);
当然,缺点是你现在必须调用它三次(因为反过来,你将不得不将数组存储在一个临时的数组中,如注释中所示,相比之下,你也不会获得太多收益),最后,你获得了灵活性,并在不需要临时数组对象时额外避免了临时数组对象。
如果你仍然坚持使用数组,你需要一个临时的
float[] rgb = rgbToFloat(r, g, b);
renderer.prepare(rgb[0], rgb[1], rgb[2], 1.0f);
但是我想知道为什么你不考虑 alpha:
public static float[] rgbToFloat(int r, int g, int b)
{
return rgbToFloat(r, g, b, 255);
}
public static float[] rgbToFloat(int r, int g, int b, int a)
{
return new float[] { r / 255.0f, g / 255.0f, b / 255.0f, a / 255.0f };
}
这是“X-Y问题”的典型例子。您最初的任务是以某种方式将对要传递给函数的 3 个不同参数进行分组。这就是“问题X”。然后你想出了使用数组的想法,但你仍然不确定如何去做,所以你发布了这个问题,询问如何最好地使用数组来实现你想要的。但那是“问题Y”,而不是“问题X”。
使用数组可能是也可能不是解决“问题 X”的正确方法。(剧透:事实并非如此。
尊重最小惊喜的原则,在我看来,解决问题“X”的最佳方法是声明一个新类,该类将四个浮点封装在单个浮点成员中:.FloatRgba
final float r; final float g; final float b; final float a;
因此,您的方法不必返回未识别的浮点数组,而是成为以下以下的工厂方法:rgbToFloat()
static
FloatRgba
public static FloatRgba fromIntRgb( int r, int g, int b )
{
return new FloatRgba( r / 255f, g / 255f, b / 255f, 1.0f );
}
最后,引入一个实用函数,该函数接受 a 和 a 并调用将 的各个成员传递给 。prepareRenderer
Renderer
FloatRgba
renderer.prepare(float, float, float, float)
FloatRgba
通过这种方式,您可以保持一切清晰、自记录和强类型化。是的,这有点不方便,但那是给你的java。
评论
prepareRenderer
评论
rbgToFloat(array[0], array[1], array[2])
float[] tmp = rgbToFloat()
prepare(tmp[0], tmp[1], tmp[2], 1)