.collect(ImmutableCollectors.partitioningBy( e -> isLiftable(e.getValue()), ImmutableCollectors.toMap()));
public static <T, A , D> Collector<T, ?, ImmutableMap<Boolean, D>> partitioningBy (Predicate<? super T> predicate, Collector<T, A , D> innerCollector){ //Supplier (stores a binary Partition, i.e. a (two entries) map from Boolean to the supplier type A of the // innerCollector) Supplier<Partition<A>> supplier = () -> new Partition<>( innerCollector.supplier().get(), innerCollector.supplier().get() ); //Accumulator: BiConsumer<A, ? super T> downstreamAccumulator = innerCollector.accumulator(); BiConsumer<Partition<A>, T> accumulator = (result, t) -> downstreamAccumulator.accept(predicate.test(t) ? result.forTrue : result.forFalse, t); //Merger BinaryOperator<A> op = innerCollector.combiner(); BinaryOperator<Partition<A>> combiner = (left, right) -> new Partition<>(op.apply(left.forTrue, right.forTrue), op.apply(left.forFalse, right.forFalse)); //Finisher Function<Partition<A>, ImmutableMap<Boolean, D>> finisher = par -> ImmutableMap.of( true, innerCollector.finisher().apply(par.forTrue), false, innerCollector.finisher().apply(par.forFalse) ); return Collector.of(supplier, accumulator, combiner, finisher, Collector.Characteristics.UNORDERED); } }
public static <T, A , D> Collector<T, ?, ImmutableMap<Boolean, D>> partitioningBy (Predicate<? super T> predicate, Collector<T, A , D> innerCollector){ //Supplier (stores a binary Partition, i.e. a (two entries) map from Boolean to the supplier type A of the // innerCollector) Supplier<Partition<A>> supplier = () -> new Partition<>( innerCollector.supplier().get(), innerCollector.supplier().get() ); //Accumulator: BiConsumer<A, ? super T> downstreamAccumulator = innerCollector.accumulator(); BiConsumer<Partition<A>, T> accumulator = (result, t) -> downstreamAccumulator.accept(predicate.test(t) ? result.forTrue : result.forFalse, t); //Merger BinaryOperator<A> op = innerCollector.combiner(); BinaryOperator<Partition<A>> combiner = (left, right) -> new Partition<>(op.apply(left.forTrue, right.forTrue), op.apply(left.forFalse, right.forFalse)); //Finisher Function<Partition<A>, ImmutableMap<Boolean, D>> finisher = par -> ImmutableMap.of( true, innerCollector.finisher().apply(par.forTrue), false, innerCollector.finisher().apply(par.forFalse) ); return Collector.of(supplier, accumulator, combiner, finisher, Collector.Characteristics.UNORDERED); } }