LoginSignup
0
0

More than 1 year has passed since last update.

stream Collector interface

Last updated at Posted at 2023-01-30

Collector sample

accumlator process本体
finisher 中間値→return値
supplier 中間値のインスタンス生成

なぜこんなものをつくったのか

supplier, accumlator, finisherを一つのメソッドに書くと
accumlatorは、for/whileを書かざるを得なくなる、これでは、streamメリットが減る。
そのため、作者はaccumlatorを切り出し、collector側で回すようにした。
様々な処理にも耐えうるようその他の機能を切り出しメソッドに用意した。
各メソッドはfunctional interfaceを強制させることにより記載を標準化。

以下はstring arrayを,区切りで連結するサンプル

class SampleCollector implements Collector<String, StringBuilder, String> {
    @Override
    public Supplier<StringBuilder> supplier() {
        return StringBuilder::new;
    }

    @Override
    public BiConsumer<StringBuilder, String> accumulator() {
        return (builder, str) -> {
            if (builder.length() != 0) {
                builder.append(",");
            }
            builder.append(str);
        };
    }

    @Override
    public BinaryOperator<StringBuilder> combiner() {
        return (a,b) -> {
            if (a.length() != 0) {
                a.append(",");
            }
            a.append(b);
            return a;
        };
    }

    @Override
    public Function<StringBuilder, String> finisher() {
        return builder -> builder.toString();
    }

    @Override
    public Set<Characteristics> characteristics() {
        return EnumSet.noneOf(Characteristics.class);
//        return EnumSet.of(Characteristics.CONCURRENT);
    }
    
}
public class Outer {
    public static void main(String[] args) {
        List<String> l = Arrays.asList("1","2","3","4","5");
        Stream<String> st = l.parallelStream();
        String str = st.collect(new SampleCollector());
        System.out.println(str);
    }
}
1,2,3,4,5
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0