Я пытаюсь обработать некоторые побитовые операции с числами int []. Для каждой операции я создаю отдельный статический метод непосредственно внутри класса Main и передаю массив чисел, а также битовую позицию, которую я хочу изменить. На самом деле ничего интересного.
Мой вопрос, вероятно, очень глупый, но поскольку Java ВСЕГДА передает по значению, почему мои методы не меняют мой источник, когда я использую Arrays.stream (numbers []) ... но только когда я использую for-loop.
В обоих случаях я передаю ссылку на массив, почему он не работает, помогите, пожалуйста, это сводит меня с ума :(
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, вы будете использовать toArray(int[]::new) или аналогичный.
Если вы выберете вариант №2, я бы рекомендовал начать с IntStream.range(numbers.length), поскольку это упростит назначение по заданным индексам.
«map ()» не должен изменять исходный поток (который в любом случае неизменен, AFAIK). Он просто возвращает новый поток (не беспокойтесь об эффективности базового хранилища, потому что это всего лишь поток, но все же). Если хотите, можете просто записать новый результат в новую переменную. Но в вашем случае цикл for кажется достаточно хорошим.
Как вы думаете, почему это должно происходить? Почему у вас сложилось впечатление, что
Arrays.streamчто-то делает с входным массивом?