static PartialCollector<StringBuilder, String> joining(CharSequence delimiter, CharSequence prefix, CharSequence suffix, boolean hasPS) { BiConsumer<StringBuilder, StringBuilder> merger = (sb1, sb2) -> { if (sb2.length() > 0) { if (sb1.length() > 0) sb1.append(delimiter); sb1.append(sb2); } }; Supplier<StringBuilder> supplier = StringBuilder::new; if (hasPS) return new PartialCollector<>(supplier, merger, sb -> String.valueOf(prefix) + sb + suffix, NO_CHARACTERISTICS); return new PartialCollector<>(supplier, merger, StringBuilder::toString, NO_CHARACTERISTICS); } }
static PartialCollector<ObjIntBox<BitSet>, boolean[]> booleanArray() { return new PartialCollector<>(() -> new ObjIntBox<>(new BitSet(), 0), (box1, box2) -> { box2.a.stream().forEach(i -> box1.a.set(i + box1.b)); box1.b = StrictMath.addExact(box1.b, box2.b); }, box -> { boolean[] res = new boolean[box.b]; box.a.stream().forEach(i -> res[i] = true); return res; }, NO_CHARACTERISTICS); }
@SuppressWarnings("unchecked") static <K, D, A, M extends Map<K, D>> PartialCollector<Map<K, A>, M> grouping(Supplier<M> mapFactory, Collector<?, A, D> downstream) { BinaryOperator<A> downstreamMerger = downstream.combiner(); BiConsumer<Map<K, A>, Map<K, A>> merger = (map1, map2) -> { for (Map.Entry<K, A> e : map2.entrySet()) map1.merge(e.getKey(), e.getValue(), downstreamMerger); }; if (downstream.characteristics().contains(Collector.Characteristics.IDENTITY_FINISH)) { return (PartialCollector<Map<K, A>, M>) new PartialCollector<>((Supplier<Map<K, A>>) mapFactory, merger, Function.identity(), ID_CHARACTERISTICS); } Function<A, D> downstreamFinisher = downstream.finisher(); return new PartialCollector<>((Supplier<Map<K, A>>) mapFactory, merger, map -> { map.replaceAll((k, v) -> ((Function<A, A>) downstreamFinisher).apply(v)); return (M) map; }, NO_CHARACTERISTICS); }
@SuppressWarnings({ "unchecked", "rawtypes" }) static <A, R> PartialCollector<BooleanMap<A>, Map<Boolean, R>> partialCollector(Collector<?, A, R> downstream) { Supplier<A> downstreamSupplier = downstream.supplier(); Supplier<BooleanMap<A>> supplier = () -> new BooleanMap<>(downstreamSupplier.get(), downstreamSupplier .get()); BinaryOperator<A> downstreamCombiner = downstream.combiner(); BiConsumer<BooleanMap<A>, BooleanMap<A>> merger = (left, right) -> { left.trueValue = downstreamCombiner.apply(left.trueValue, right.trueValue); left.falseValue = downstreamCombiner.apply(left.falseValue, right.falseValue); }; if (downstream.characteristics().contains(Collector.Characteristics.IDENTITY_FINISH)) { return (PartialCollector) new PartialCollector<>(supplier, merger, Function.identity(), ID_CHARACTERISTICS); } Function<A, R> downstreamFinisher = downstream.finisher(); return new PartialCollector<>(supplier, merger, par -> new BooleanMap<>(downstreamFinisher .apply(par.trueValue), downstreamFinisher.apply(par.falseValue)), NO_CHARACTERISTICS); } }
static PartialCollector<int[], Integer> intSum() { return new PartialCollector<>(() -> new int[1], (box1, box2) -> box1[0] += box2[0], UNBOX_INT, UNORDERED_CHARACTERISTICS); }
static PartialCollector<long[], Long> longSum() { return new PartialCollector<>(() -> new long[1], (box1, box2) -> box1[0] += box2[0], UNBOX_LONG, UNORDERED_CHARACTERISTICS); }
static <A, R> PartialCollector<Box<A>, R> partialCollector(Collector<?, A, R> c) { Supplier<A> supplier = c.supplier(); BinaryOperator<A> combiner = c.combiner(); Function<A, R> finisher = c.finisher(); return new PartialCollector<>(() -> new Box<>(supplier.get()), (box1, box2) -> box1.a = combiner.apply( box1.a, box2.a), box -> finisher.apply(box.a), NO_CHARACTERISTICS); }