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