Stream 処理して単に、boolean を集計したい時、
1つでも true が発生、または全てが true になるかを求める時など、
forEach で、AtomicBoolean をセットするのは直感的だが、賢くはない。
map メソッドで、Boolean に変換して collect で集計するのがスマートである。
Stream<T> stream;
stream.map(t->{ // TODO return true か false を返す。。。 })
1つでも true → trueを返す。
.collect( Collectors.reducing(false, Boolean::logicalOr) );
全部 true → trueを返す。
.collect( Collectors.reducing(true, Boolean::logicalAnd) );
Collectors.reducing は、これらの map の使い方によっては、以下のような集計もできる。
例)任意のリストで、ある条件で、map で Boolean を返すようにする。
例えば、30 より大きい値をカウントする。
int count = Arrays.asList(1, 12, 4, 23, 33, 43, 3, 55) .stream().map(i->i > 30) .collect(Collectors.reducing(0, t->t ? 1 : 0, (a, b)->a+b));
map メソッドで boolean に変換して、、
.collect(Collectors.reducing(0, t->t ? 1 : 0, (a, b)->a+b));
でも、あまりこんなカウントの方法でなくて、filter して Collectors.counting() を求めるのが
多くのやり方であろう。