Java / Ope / Collection操作 / Stream / 終端処理 / collect / of

Java / Ope / Collection操作 / Stream / 終端処理 / collect / of

独自 Collector をその場で指定して処理させることもできる。

このように作る。reduce と似た感じで作ることができるが、型を自在に操作できるところに便利さがある。

今回集約結果として Hoge を準備する。アキュムレータで頑張ればなんとでもなるのだが集約用のメソッドがあると便利ではある。

public static class Hoge{
    public int sum;
 
    public Hoge() {
        this.sum = 0;
    }
 
    public void addMe(Hoge v) {
        this.sum = this.sum + v.sum;
    }
    public void addMe(int v) {
        this.sum = this.sum + v;
    }
}

その結果をこのように生成できる

Hoge hoge = Stream.of(1, 2, 3, 4, 5).collect(
        Collector.of(
                () -> new Hoge(),          // 集約値の初期状態を生成するラムダ
                (Hoge s, Integer v) -> {   // 集約処理そのもの。集約値、各要素値を受けるラムダ。void 返却なため、集約値はミュータブルである必要がある。ここが reduce と違う
                    s.addMe(v);
                },
                (Hoge s1, Hoge s2) -> {    // 集約の集約、並列処理の効率化のために用いられるが独自 collector は並列化サポートされてない?
                    s1.addMe(s2);
                    return s1;
                },
                Characteristics.IDENTITY_FINISH   // 最終結果を特に何もしないでそのまま出力するならこれを指定しておくっぽい
        )
);
System.out.println(hoge.sum);  // => 15
java/ope/collection_ope/stream/tarminator/collect/of.txt · 最終更新: 2020-12-31 11:40 by ore