【问题标题】:Why Arrays.Stream () does not modify int[] inside of a method in Java为什么 Arrays.Stream() 不修改 Java 中方法内部的 int[]
【发布时间】:2019-02-23 19:59:46
【问题描述】:

我正在尝试对数字的 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 对输入数组做了任何事情?
  • 你应该做一个更小的例子,里面的逻辑更少,在这里测试东西并提出问题。用一种方法做一个例子,没有太多的分支。
  • 另外,查找中间和终端操作。

标签: java arrays pass-by-value


【解决方案1】:
Arrays.stream(numbers).map(x-> x +2);

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

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

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

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

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

【讨论】:

    【解决方案2】:

    "map()" 不应该更改原始流(AFAIK 无论如何都是不可变的)。它只是返回一个新的流(不用担心底层的存储效率,因为它只是一个流,但仍然如此)。如果您愿意,您可以将新结果捕获到新变量中。但在您的情况下,“for”循环似乎已经足够好了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-05
      • 2015-11-13
      • 2016-05-23
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多