ContainerCollector.java (1331B)
1 package osm.common; 2 3 import java.util.Set; 4 import java.util.function.BiConsumer; 5 import java.util.function.BinaryOperator; 6 import java.util.function.Function; 7 import java.util.function.Supplier; 8 import java.util.stream.Collector; 9 10 public class ContainerCollector<T extends Container<T, A>, A> implements Collector<A, T, T> { 11 public static final int CONCURRENT = 1 << 0; 12 public static final int UNORDERED = 1 << 1; 13 public static final int IDENTITY_FINISH = 1 << 2; 14 15 private final Supplier<T> supplier; 16 private final Set<Characteristics> characteristics; 17 18 public ContainerCollector(Supplier<T> supplier, Set<Characteristics> characteristics) { 19 this.supplier = supplier; 20 this.characteristics = characteristics; 21 } 22 23 @Override 24 public Supplier<T> supplier() { 25 return supplier; 26 } 27 28 @Override 29 public BiConsumer<T, A> accumulator() { 30 return Container::accumulate; 31 } 32 33 @Override 34 public BinaryOperator<T> combiner() { 35 return (a, b) -> { 36 a.fold(b); 37 return a; 38 }; 39 } 40 41 @Override 42 public Function<T, T> finisher() { 43 return c -> { 44 c.finish(); 45 return c; 46 }; 47 } 48 49 @Override 50 public Set<Characteristics> characteristics() { 51 return characteristics; 52 } 53 }