public static <T, K, V> MutableMap<K, V> aggregateBy(
            Iterable<T> iterable,
            Function<? super T, ? extends K> groupBy,
            Function0<? extends V> zeroValueFactory,
            Function2<? super V, ? super T, ? extends V> nonMutatingAggregator)
    {
        return FJIterate.aggregateBy(
                iterable,
                groupBy,
                zeroValueFactory,
                nonMutatingAggregator,
                FJIterate.DEFAULT_MIN_FORK_SIZE);
    }
@Test
    public void aggregateBy()
    {
        Function2<Integer, Integer, Integer> countAggregator = (aggregate, value) -> aggregate + 1;
        List<Integer> list = Interval.oneTo(20000);
        MutableMap<String, Integer> aggregation =
                FJIterate.aggregateBy(list, EVEN_OR_ODD, INTEGER_NEW, countAggregator);
        assertEquals(10000, aggregation.get("Even").intValue());
        assertEquals(10000, aggregation.get("Odd").intValue());
        FJIterate.aggregateBy(list, EVEN_OR_ODD, INTEGER_NEW, countAggregator, aggregation);
        assertEquals(20000, aggregation.get("Even").intValue());
        assertEquals(20000, aggregation.get("Odd").intValue());
    }