Как обновить локальную примитивную переменную внутри Stream? (Java) - PullRequest
1 голос
/ 14 апреля 2020

Я работаю над кодом, в котором мне нужно посчитать количество единиц в массиве, теперь я могу сделать это по-старому, перебирая массив, но мне интересно, как это сделать с потоками.

int[] arr = {1,2,4,1,5,1}; //example array 
int oneFreq = 0;
Arrays.stream(arr).forEach(x - > {if(x==1) oneFreq++;});

Теперь это дает ошибку времени компиляции: локальные переменные, на которые ссылается лямбда-выражение, должны быть окончательными или эффективно конечными.

Есть ли обходной путь для обновления локальных переменных в потоках? Потому что сделать его окончательным означало бы, что это невозможно

1 Ответ

9 голосов
/ 14 апреля 2020

Вы можете напрямую использовать count с filter on stream

long oneFreq = Arrays.stream(arr).filter(x->x==1).count();

Или вы можете использовать AtomicInteger для увеличения счетчика, используя forEach

AtomicInteger atomicInt = new AtomicInteger(0);
Arrays.stream(arr).filter(x->x==1).forEach(i->atomicInt.incrementAndGet());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...