Java16 から使える Stream の mapMulti
mapMulti(BiConsumer> mapper)
flatMap と何が違う、使いどころがすぐに思いつかなかったが、メソッドの説明のサンプルで、
なるほど便利と思うのが書いてある。
ネストされているリストを、1つのStream にする。
class C { static void expandIterable(Object e, Consumer<Object> c) { if (e instanceof Iterable<?> elements) { for (Object ie : elements) { expandIterable(ie, c); } } else if (e != null) { c.accept(e); } } public static void main(String[] args) { var nestedList = List.of(1, List.of(2, List.of(3, 4)), 5); Stream expandedStream = nestedList.stream().mapMulti(C::expandIterable); } }
instanceof Iterable でネストされたList すなわち、Iterable かを確認して、
再帰呼び出しにして、
Consumer として受け入れ処理することで、1つのStream にするのである。
Iterable<?> でしか確認できない点を注意したい。
List<?> と Iterable<?> は、区別が付けられないのだ。
するとキャストが安全でなくなる。だからエラーになる。