[1Z0-816]Java Gold 第4章 ストリームAPI 問22について
解決したいこと
Java Gold 第4章 ストリームAPI 問22を理解したい。
mainメソッドの
list.stream().collect(new SampleCollector());
のcollectメソッドにSampleCollectorインスタンスを引数に与えた後の動きが理解できません。
SampleCollectorクラスで定義した
・supplier
・accumulator
・combiner
・finisher
・characteristics
の各メソッドはどのタイミングで呼び出されるのでしょうか?
SampleCollector
import java.util.EnumSet;
import java.util.Set;
import java.util.function.BiConsumer;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collector;
public class SampleCollector
implements Collector<String, StringBuilder, String>{
@Override //処理途中の値を保持するオブジェクトを生成するメソッド
public Supplier<StringBuilder> supplier() {
return StringBuilder::new;
}
@Override //具体的に実行したい処理を記述したBiConsumer型のラムダ式を戻すメソッド
public BiConsumer<StringBuilder, String> accumulator(){ //accumulatorメソッドを実装する無名クラス、戻り値はBiConsumer<StringBuilder, String>と定義
return (builder, str) -> {
if(builder.length() != 0){
builder.append(",");
}
builder.append(str);
};
}
@Override //
public BinaryOperator<StringBuilder> combiner(){
return null;
}
@Override //処理結果を戻すラムダ式を提供するメソッド
public Function<StringBuilder, String> finisher(){
return builder -> builder.toString();
}
@Override //Collectorの特徴を表すEnumのセットを戻すメソッド
public Set<Characteristics> characteristics(){
return EnumSet.noneOf(Characteristics.class);
}
}
CollectorSample
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
public class CollectorSample{
public static void main(String[] args){
List<String> list =
Arrays.asList("A", "B", "C", "D", "E");
String result =
list.stream().collect(new SampleCollector()); //SampleCollectorインスタンスを引数に与える
System.out.println(result);
}
}
自分で試したこと
Java Gold解説確認
ドキュメントの確認
https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/util/stream/Stream.html#collect(java.util.stream.Collector)