Предположим, что у меня массив огромный Boolean flags:
Boolean[] flags = { true, false, true }; // 3 means "many"
Я хочу сделать две вещи на flags:
- проверьте, все ли элементы
trueи возвращают индикатор; - reset все элементы
false.
Используя лямбда-выражение Java 8, я могу сделать это следующим образом:
indicator = Arrays.stream(flags).allMatch(flag -> flag);
Arrays.stream(flags).forEach(flag -> flag = false);
return indicator;
Однако эта реализация сканирует flags дважды. Поскольку flags огромен, я не хочу этого. Кроме того, я предпочитаю лямбда-способ. Есть ли способ реализации этой семантики checkIfAllTrueAndReset с (однострочным) лямбда-выражением, которое сканирует flags только один раз?
Связано, но не одно и то же: Каков самый элегантный способ проверить, истинны ли все значения в булевом массиве?
Примечание: Я многому учусь из комментариев и ответов. Спасибо всем!
-
Streamклассный, но это не для этого. -
BitSet(и его бит-разумно атомный аналогAtomicBitSet) более подходит для этого (так принято, как ответ, спасибо другим). - Побочные эффекты в
map(Streamили вообще функциональное программирование) обескуражены. -
Arrays.stream(flags).forEach(flag -> flag = false)(в моем коде) ничего не задает!