AtomicInteger
уже упоминалось.Изменяемые Double
s можно эмулировать с помощью AtomicReference<Double>
.Уже упомянутые предупреждения применяются, и это плохой стиль, но иногда у вас есть такой код
double sum=0
for (Data data:someListGenerator())
sum+=data.getValue()
и вы хотите изменить его в функциональном стиле Java 8.Если код следует этому шаблону, но добавляет к нему значительную сложность, наиболее разумное преобразование может быть
AtomicReference<Double> sumref=new AtomicReference<>(0d);
someStreamGenerator().forEach(data->
sumref.set(sumref.get().doubleValue()+data.getValue()));
double sum=sumref.get().doubleValue();
Конечно, это по крайней мере сомнительный стиль.Но я не раз оказывался в ситуации с витой петлей на ResultSet
вычислениях и частично накапливая три разные данные из этого.Это действительно затрудняет преобразование кода в правильный функциональный стиль.Преобразование кумулятивных частей в соответствии с описанным выше шаблоном показалось мне разумным компромиссом между чистым кодом и упрощенным рефакторингом.