2015-11-12 6 views
0

Я пытаюсь понять, почему следующий фрагмент кода не работает должным образом. Я подозреваю, что это из-за неизменности класса Integer, но это не совсем ясно. Не могли бы вы объяснить мне это?Iterable.forEach (Consumer)

List<Integer> a1 = Arrays.asList(1, 2, 4); 
    a1.forEach(integer -> integer += 10); 
+1

Можете ли вы определить, что вы ожидаете и что получаете? – Philibobby

+1

Это та же проблема, что и в случае 'for (int value: list) {value = value + 10;}'. – Pshemo

+0

@Philibobby см. Ответ erickson –

ответ

8

Используйте это:

a1.replaceAll(integer -> integer + 10); 

Integer объекты неизменны. integer += 10 означает

integer = Integer.valueOf(integer.intValue() + 10); 

Поскольку integer является локальной переменной, результат отбрасывается, когда Consumer возвращается.

+0

Спасибо за объяснение –

0

Ваш код очень похож на это:

for (int i = 0; i<a1.size(); i++){ 
    int integer = a1.get(i); 
    integer = integer + 10; 
} 

Просто потому, что вы обновили значение локальной переменной integer (который содержит текущий элемент из списка), это не означает, что вы обновленное значение в самом списке.

Вы также можете думать о нем, как

int a = 10; 
int b = a; 
b = 20; 

только потому, что мы изменили значение в b это не означает, что мы изменили также значение из a.

Если вы ищете метод, который обновит все значения из списка в соответствии с некоторой функцией, используйте метод replaceAll, добавленный как pointed by erickson.