如何在Java中连接两个float数组?

时间:2017-10-25 09:58:34

标签: java arrays java-8

使用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

4 个答案:

答案 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);

但对于这么简单的事情来说,这太多了。