mapMulti

Java16 から使える Stream の mapMulti
mapMulti(BiConsumer<? super Object, ? super Consumer<Object>> 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<?> は、区別が付けられないのだ。
するとキャストが安全でなくなる。だからエラーになる。