将一个数组展开为多个参数传递给一个函数

10

我该如何在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); 

2
为什么不将它保存为中间值,然后可以将其作为 rbgToFloat(array[0], array[1], array[2]) 传递。您可以使用 float[] tmp = rgbToFloat(),然后使用 prepare(tmp[0], tmp[1], tmp[2], 1) - ZeldaZach
你必须手动解压它。抱歉。 - khelwood
好的。Java 没有这个能力似乎很奇怪,我在其他地方都看到了。 - Jacob Birkett
如果函数接收的是一个元素数组而不是每个元素单独传入,你可以使用类似于你尝试做的语法。在这里查看 - Isac
2个回答

2
这是一个典型的“X-Y问题”示例。你最初的问题是如何将想要传递给函数的三个不同参数进行分组,这就是“问题X”。然后你想到了使用数组来解决问题,但你仍然不确定如何去做,所以你发帖询问如何最好地使用数组来实现你想要的目标。但这是“问题Y”,而不是“问题X”。
使用数组可能是解决“问题X”的正确方法,也可能不是(剧透:它不是)。为了遵循“最小惊奇原则”,我认为解决你的“问题X”的最佳方式是声明一个新类FloatRgba,它将四个浮点数封装在单独的浮点成员变量中:final float r; final float g; final float b; final float a;。
因此,你的rgbToFloat()方法不必返回未经识别的浮点数数组,而是变成了FloatRgba的静态工厂方法。
public static FloatRgba fromIntRgb( int r, int g, int b ) 
{
    return new FloatRgba( r / 255f, g / 255f, b / 255f, 1.0f );
}

最后,您引入了一个实用程序函数prepareRenderer,它接受一个Renderer和一个FloatRgba并调用renderer.prepare(float, float, float, float)FloatRgba的各个成员传递给它。

这样可以保持一切清晰、自文档化和强类型。是的,它有点冗长,但这就是Java。


1
一个不那么复杂的解决方案可能是让 prepareRenderer 简单地接受渲染器和三个整数。关于 X/Y 问题,你发现得真好 ;) - Aconcagua

0
也许对于最初的问题来说有点晚了,但可能会帮助到后来者(比如我):我更建议将一个单一的参数转换为浮点数。
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 };
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接