使用Java 8我试图连接两个浮点数组:
void f(float[] first, float[] second) {
float[] both = ???
}
通过快速搜索,我认为我可以简单地按照here的指示进行操作。所以我试过了:
float both[] = FloatStream.concat(Arrays.stream(first), Arrays.stream(second)).toArray();
但是这不按照here解释的那样进行编译。所以我尝试了效率较低的解决方案并直接使用Stream
:
float[] both = Stream.concat(Arrays.stream(first), Arrays.stream(second)).toArray(float[]::new);
它无法从我的日食中编译说:
The method stream(T[]) in the type Arrays is not applicable for the arguments (float[])
在Java 8中连接两个float[]
数组的最有效(和简单)方法是什么?
更新:显然问题的关键在于我必须处理float
而不是double
。
答案 0 :(得分:7)
不要自己动手,使用System.arrayCopy()
将两个数组复制到组合大小的新数组中。这样效率更高,因为它使用本机操作系统代码。
答案 1 :(得分:2)
由于没有FloatStream
,甚至从浮点数组中创建(低效)盒装流并不简单,您将找不到比
static float[] f(float[] first, float[] second) {
float[] both = Arrays.copyOf(first, first.length+second.length);
System.arraycopy(second, 0, both, first.length, second.length);
return both;
}
即使使用并行流的选项也不可能超过提高的复杂性。你需要非常大的数组才能看到好处。
答案 2 :(得分:1)
不要编写自己的代码来执行此操作。问题已经解决和测试。您应该使用Apache Commons ArrayUtils
class。
float[] both = ArrayUtils.addAll(first, second);
在封面下,对于一些特殊情况,它有一些逻辑,其中一个输入或另一个输入为空,然后两次调用System.arraycopy
。但你不必担心任何这些。
答案 3 :(得分:0)
番石榴是一种选择吗?因为它Floats.concat
更流畅,但它仍在System.arrayCopy
下面。
问题是jdk
没有FloatStream
- 可以在这里使用,你可能会从这样的事情中返回Float[]
:
Stream.concat(
IntStream.range(0, first.length)
.boxed()
.map(x -> first[x]),
IntStream.range(0, first.length)
.boxed()
.map(y -> first[y]))
.toArray(Float[]::new);
但对于这么简单的事情来说,这太多了。