如何使用 Java 流克隆数组?

How to clone an array using Java stream?

我有以下数组:

int nums[] = new int[]{1,2,3,4,5};

我想使用流或其他正确的方式将相同的元素添加到数组中,如果使用流更好的话。 ListaddAll() 方法,但我不能将它用于数组,我不确定数组是否有正确的方法。那么,如何将此列表转换为:

int nums[] = new int[]{1,2,3,4,5,1,2,3,4,5};

使用Arrays.asList(您的数组)将您的数组转换为列表

List<Integer> numList = Arrays.asList(nums);

根据您显示的输出 int nums[] = new int[]{1,2,3,4,5,1,2,3,4,5}; 和您的陈述

I want to add the same elements to the array

我想你想问的是如何 re-add 一个数组的元素到同一个数组,虽然你的第一个片段显示 int nums[] = new int[]{4,5,6,7,0,1,2}; 而输出与第一个完全无关数组(可能是个小错误)。

但是,在 Java 中无法更新数组的大小。一旦数组被实例化,它的大小就固定了。您可以做的是声明另一个数组,其大小是您要从中复制的原始数组的两倍。

正如@Ole V.V 在评论中指出的那样。您可以使用 IntStream 来实现这一点,这是一种比我使用的方法更好的方法,因为它不会强制您将工作类型从 int[] 更改为 Integer[]。事实上,Stream class 适用于泛型类型,因此它适用的唯一参数类型是引用;因此,您只能检索 Integer[] 而不是 int[].

的数组

使用 IntStream 的解决方案

int nums[] = new int[]{1, 2, 3, 4, 5};

int[] res = IntStream.concat(IntStream.of(nums), IntStream.of(nums)).toArray();

System.out.println(Arrays.toString(res));

流解决方案

int nums[] = new int[]{1, 2, 3, 4, 5};

Integer[] res = new Integer[0];
res = Stream.concat(Arrays.stream(nums).boxed(), Arrays.stream(nums).boxed())
        .collect(Collectors.toList())
        .toArray(res);

System.out.println(Arrays.toString(res));

使用 Arrays.copyOf(arg, arg) 怎么样?

public static void main(String[] args) {
 int[] nums = new int[]{1, 2, 3, 4, 5, 1, 2, 3, 4, 5};
 int[] copiedArray = Arrays.copyOf(nums, nums.length);
}

如果你真的想使用Stream,

public static void main(String[] args) {
 int[] nums = new int[]{1, 2, 3, 4, 5, 1, 2, 3, 4, 5};
 int[] copiedArray = Arrays.stream(nums).toArray();
}

根据期望的输出,我猜测初始数组是:

int[] nums = new int[]{1, 2, 3, 4, 5};

数组一旦创建就无法更改其大小,因此您需要声明一个新数组。 @Dan 已经提供了一个带流的 ,所以为了完整起见,我将给出一个带循环的。

public class Temp {

    public static void main(String[] args) throws Exception {
        int[] nums = new int[]{1, 2, 3, 4, 5};
        System.out.println("Initial array");
        System.out.println(Arrays.toString(nums));

        int[] result = new int[nums.length * 2];
        for (int i = 0; i < nums.length; i++) {
            result[i] = nums[i];
            result[i + nums.length] = nums[i];
        }

        System.out.println("Result array");
        System.out.println(Arrays.toString(result));
    }
}

优点是用于填充结果数组的单次迭代。

编辑: 根据@OleV.V 的建议。使用 System.arraycopy() 的解决方案如下所示:

public class Temp {

    public static void main(String[] args) throws Exception {
        int[] nums = new int[]{1, 2, 3, 4, 5};

        int[] result = new int[nums.length * 2];
        System.arraycopy(nums, 0, result, 0, nums.length);
        System.arraycopy(nums, 0, result, nums.length, nums.length);
        
        System.out.println(Arrays.toString(result));
    }
}

优点是 System.arraycopy() 是高度优化和高效的。

迭代或基于流的解决方案不必要地复杂和缓慢。只需使用 System.arraycopy:

public class Test {
    public static void main(String[] args) {

        int[] a = {1,2,3,4,5};
        int[] b = {6,7,8,9,10};

        int[] aAndB = new int[a.length + b.length];
        System.arraycopy(a, 0, aAndB, 0, a.length);
        System.arraycopy(b, 0, aAndB, a.length, b.length);

        System.out.println(Arrays.toString(aAndB));
    }
}

System.arraycopy 高度优化:Why is System.arraycopy native in Java?