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

7
使用Java 8,我正在尝试连接两个浮点数组:
void f(float[] first, float[] second) {
    float[] both = ???
}

从快速的SO搜索中,我认为我可以简单地按照这里的说明进行操作。所以我尝试了以下代码:

float both[] = FloatStream.concat(Arrays.stream(first), Arrays.stream(second)).toArray();

但是按照这里所解释的,这不会编译通过。因此我尝试了效率较低的解决方案,直接使用Stream
float[] both = Stream.concat(Arrays.stream(first), Arrays.stream(second)).toArray(float[]::new);

我的eclipse编译失败,显示以下信息:

The method stream(T[]) in the type Arrays is not applicable for the arguments  (float[])

在Java 8中,连接两个float数组的最高效且简单的方法是什么?更新:显然问题的重点在于我必须处理float而不是double。

1
{btsdaf} - Eran
4个回答

6
不要自己操作,使用System.arrayCopy()将两个数组复制到一个新的数组中,其大小为两个数组之和。这样更有效率,因为它使用操作系统本地代码。

1
本地化并不一定意味着更快,虽然有时候可能是这样,但这并不是绝对的规律。 - Eugene

4

由于没有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;
}

即使使用并行流的选项,也很难抵消提高的复杂性。你需要非常大的数组才能看到收益。


1
{btsdaf} - Naman

2
不要自己编写代码来做这件事。问题已经被解决并测试过了。你应该使用Apache Commons ArrayUtils
float[] both = ArrayUtils.addAll(first, second);

在底层,它有一些逻辑来处理其中一个输入或另一个输入为 null 的特殊情况,然后是两个对 System.arraycopy 的调用。但您不需要担心这些。

在我看来,这是正确的答案,一个能够有效解决问题的一行代码。 - waykiki

0

Guava 是一个选项吗?因为它有 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);

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


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