Можем ли мы назначить переменную для зацикливания значению внутри l oop in Java? - PullRequest
0 голосов
/ 17 февраля 2020

Я хотел бы присвоить определенное значение итерационной переменной внутри a для l oop в Java.

List<Integer> values = Arrays.asList(1,2,4,16,32,64,128);
for (Integer value: values) {
   value = value / 2;  // local value
}

Работает ли это назначение в java?

Ответы [ 2 ]

1 голос
/ 17 февраля 2020

Нет, вы не можете, а также не рекомендуется, однако в вашем случае

List<Integer> values = Arrays.asList(1,2,4,16,32,64,128);
    for (Integer value: values) {
       value = value / 2;  // local value even its modify it will not affect in collection so you will not get an error.
    }

Java имеет тип значения и тип ссылки . поэтому, если вы изменяете что-либо внутри foreach l oop и его тип значения , оно будет работать и его локальное значение, поэтому оно не будет изменять коллекцию, но если в качестве ссылочного типа вы получите ошибку.

В для каждого l oop мы не можем изменить коллекцию, она выдаст ConcurrentModificationException Изменение коллекции просто означает удаление элемент или изменение содержимого элемента, хранящегося в коллекции.

Если вы хотите изменить коллекцию, используйте итератор

, если вам просто нужно использовать обход foreach

, пожалуйста, посетите здесь

0 голосов
/ 17 февраля 2020

Вы можете сделать это, взломав свой путь, но это очень подозрительно, и если вам это действительно нужно, вы, вероятно, делаете что-то не так.

Вам может понадобиться другая коллекция, куда вы можете положить обработанные значения,

List<Integer> values = Arrays.asList(1,2,4,16,32,64,128);
List<Integer> newValues = new LinkedList();

for (Integer value: values) {
  newValues.add(value / 2); 
}

Или, если вы спросите, можете ли вы просто переназначить значение итератора, конечно, это возможно, но опять же немного подозрительно. Возможно, вы можете использовать его в таком случае;

List<Integer> values = Arrays.asList(1,2,4,16,32,64,128);

for (Integer value: values) {
  if(value > 32)
    value = 32;
  process(value); 
}

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

...