gpt4 book ai didi

java - 为什么 Arrays.Stream() 不修改 Java 方法内部的 int[]

转载 作者:行者123 更新时间:2023-12-02 10:47:55 24 4
gpt4 key购买 nike

我正在尝试对数字的 int[] 进行一些按位运算。对于每个操作,我直接在 Main 类内部创建一个单独的静态方法,并传递数字数组以及我想要修改的位位置。实在没什么有趣的事。

我的问题可能很愚蠢,但由于Java总是按值传递,为什么当我使用Arrays.stream(numbers[])时我的方法没有改变我的源...但只有当我使用for循环时。

在这两种情况下,我都将引用传递给数组,为什么它不起作用,请帮助这让我发疯:(

public class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(reader.readLine());
int [] numbers = new int[n];
for (int i =0; i < n; i++) {
numbers[i] = Integer.parseInt(reader.readLine());
}

String line = reader.readLine();
while (!"party over".equalsIgnoreCase(line)) {
String operation = line.split("\\s+")[0];
int position = Integer.parseInt(line.split("\\s+")[1]);
switch (operation) {
case "-1":
flipTheBitAtPosition (numbers, position);
break;
case "0" :
turnBitAtPositionToZero (numbers, position);
break;
case "1":
turnBitAtPositionToOne(numbers, position);
break;
}


line = reader.readLine();
}

Arrays.stream(numbers).forEach(x-> System.out.println(x));
}

private static void turnBitAtPositionToOne(int[] numbers, int position) {
int mask = 1 <<position;
//this does not modifty the numbers array
Arrays.stream(numbers).map(x-> x|mask);

//this does modify the numbers array Why ?!
for (int i =0; i < numbers.length; i++) {
numbers[i] |= mask;
}

}

private static void turnBitAtPositionToZero(int[] numbers, int position) {
int mask = ~(1 <<position);
//this does not modifty the numbers array
Arrays.stream(numbers).map(x->x & mask);
}

private static void flipTheBitAtPosition(int[] numbers, int position) {
int mask = 1 <<position;
//this does not modifty the numbers array
Arrays.stream(numbers).map(x->x ^ mask);

}

}

最佳答案

Arrays.stream(numbers).map(x-> x +2);

此代码创建一个整数流,然后将其映射到修改后的整数流。它绝不会为数组赋值,也不会通过终端操作返回数组。这可能被视为正在进行的流,因为您尚未调用任何终端操作,例如 toArray 或 forEach。

因此,使用 Stream,您基本上有两个选择。要么:

  1. 返回一个新数组,然后将其分配给(或复制到)原始变量。
  2. 或使用 forEach 分配每个索引...这就像 for 循环的 Stream 版本。

如果您选择选项 #1,那么您将使用 toArray(int[]::new) 或类似的。

如果您选择选项 #2,那么我建议从 IntStream.range(numbers.length) 开始,因为这样可以轻松地在给定索引处进行分配。

关于java - 为什么 Arrays.Stream() 不修改 Java 方法内部的 int[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52409329/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com