質問: 実装不要? // (まじめに実装するなら2つの並行Mapのマージが必要) System.out.println("!"); return null; }, Collector.Characteristics.CONCURRENT, Collector.Characteristics.UNORDERED )); System.out.println("r="+result); } } ```
回答: 仮定してもいいです。 並列リダクション(concurrency reduction)を行うと判断するために、 Java8 ランタイムは3条件をみます。Concurrency reduction が起こった場合は、 combiner が利用されません。このことは JavaDoc に記載されています。 * ストリームが parallel であること * コレクタが concurrent であること * ストリームが unordered か、 コレクタが unordered 特性をもつこと ただし、悩ましいことがあります。私の回答としては、「 combiner は利用されない、しかし実装しなければならない。」です。API で期待されている実装の一部を抜くというのは、好ましくないという単純な理由からです。 Java8 の Stream API の設計思想に「順列と並列でAPIの利用方法が同一であること」があります。ですので、使用されないとあなたが判断できる場合でも、APIの呼び出し手順を満たすために実装しなければならない、という状態になっています。ですので、空の実装にするのではなく、動くコードを書いておくべきだと思います。(当然テスト対象になり得ます・・・gaaah) サンプルの例のようにプログラムが一画面におさまり、combiner の実装を利用者が認識できる状態なら問題はないでしょうけどね。 参考: * Setting of UNORDERED on concurrent collectors * State of the Lambda: Libraries Edition - Background