将数组分散为函数的多个参数

Spread an array into multiple arguments for a function

提问人:Jacob Birkett 提问时间:7/2/2017 最后编辑:Jason AllerJacob Birkett 更新时间:8/7/2020 访问量:2150

问:

如何在 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赞 ZeldaZach 7/2/2017
为什么不将其保存为中间 gorund,然后您可以将其传递为 .你可以然后rbgToFloat(array[0], array[1], array[2])float[] tmp = rgbToFloat()prepare(tmp[0], tmp[1], tmp[2], 1)
0赞 khelwood 7/2/2017
您必须手动解压。不好意思。
0赞 Jacob Birkett 7/2/2017
好。Java 没有这种能力似乎很奇怪,我在其他任何地方都看到它。
0赞 Isac 7/2/2017
如果函数接收元素数组而不是单独接收每个元素,则可以使用与尝试执行的操作类似的语法。 在这里看看吧

答:

0赞 Aconcagua 8/21/2018 #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 };
}
2赞 Mike Nakis 5/8/2020 #2

这是“X-Y问题”的典型例子。您最初的任务是以某种方式将对要传递给函数的 3 个不同参数进行分组。这就是“问题X”。然后你想出了使用数组的想法,但你仍然不确定如何去做,所以你发布了这个问题,询问如何最好地使用数组来实现你想要的。但那是“问题Y”,而不是“问题X”。

使用数组可能是也可能不是解决“问题 X”的正确方法。(剧透:事实并非如此。

尊重最小惊喜的原则,在我看来,解决问题“X”的最佳方法是声明一个新类,该类将四个浮点封装在单个浮点成员中:.FloatRgbafinal float r; final float g; final float b; final float a;

因此,您的方法不必返回未识别的浮点数组,而是成为以下以下的工厂方法:rgbToFloat()staticFloatRgba

public static FloatRgba fromIntRgb( int r, int g, int b ) 
{
    return new FloatRgba( r / 255f, g / 255f, b / 255f, 1.0f );
}

最后,引入一个实用函数,该函数接受 a 和 a 并调用将 的各个成员传递给 。prepareRendererRendererFloatRgbarenderer.prepare(float, float, float, float)FloatRgba

通过这种方式,您可以保持一切清晰、自记录和强类型化。是的,这有点不方便,但那是给你的java。

评论

1赞 Aconcagua 7/8/2020
一个不太复杂的解决方案可能是让渲染器和三个整数。X/Y 问题的好点;)prepareRenderer