Почему Arrays.Stream () не изменяет int [] внутри метода в Java - PullRequest
0 голосов
/ 19 сентября 2018

Пытаюсь обработать побитовые операции над 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);

}

}

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

"map ()" не должен изменять исходный поток (который в любом случае является неизменяемым AFAIK).Он просто возвращает новый поток (не беспокойтесь о базовой эффективности хранилища, потому что это всего лишь поток, но все же).Если вы хотите, вы можете просто перехватить новый результат в новой переменной.Но в вашем случае цикл for кажется достаточно хорошим.

0 голосов
/ 19 сентября 2018
Arrays.stream(numbers).map(x-> x +2);

Этот код создает поток целых чисел, а затем отображает его в модифицированный поток целых чисел.Ни при каких условиях он не присваивает значения массиву и не возвращает массив через терминальную операцию.Это может считаться потоком незавершенного выполнения, поскольку вы не вызывали никакую терминальную операцию, такую ​​как toArray или forEach.

Итак, используя Stream, у вас в основном есть два варианта.Либо:

  1. вернуть новый массив и затем присвоить его (или скопировать в) исходную переменную.
  2. , либо использовать forEach для назначения каждого индекса ... это похоже наПотоковая версия цикла for.

Если вы перейдете к варианту # 1, вы будете использовать toArray(int[]::new) или аналогичный.

Если вы перейдете к варианту # 2, я бырекомендуем начинать с IntStream.range(numbers.length), поскольку это позволит легко назначать данные индексы.

...