# Multiple traversals

Howard Lovatt howard.lovatt at gmail.com
Fri Dec 20 17:07:05 PST 2013

```Thanks for the reply.

I was aware that summary stats existed, min and max were just an example.

Your implementation of the collector is better than mine, option 3 in original, so I will adopt your style from now on thanks.

As I said in the original email I tend towards writing collectors, however they do force boxing (no Collector.ofDouble) and they are quite a lot of code to write.

-- Howard.

> On 21 Dec 2013, at 7:36 am, Brian Goetz <brian.goetz at oracle.com> wrote:
>
> If the goal is simply to compute min/max at the same time (or any two reductions), then Collector already gives you an easy way to do that:
>
>  IntSummaryStatistics ss = list.blah(...).barg(...)
>                                .collect(summarizingInt());
>                                // or IntStream.summaryStatistics();
>
> This computes sum, min, max, count in one pass.  Of course, you can adapt this pattern to compute anything you want.  The code is trivial:
>
>    public static <T>
>    Collector<T, ?, IntSummaryStatistics> summarizingInt(ToIntFunction<? super T> mapper) {
>        return new CollectorImpl<T, IntSummaryStatistics, IntSummaryStatistics>(
>                IntSummaryStatistics::new,
>                (r, t) -> r.accept(mapper.applyAsInt(t)),
>                (l, r) -> { l.combine(r); return l; }, CH_ID);
>    }
>
> where
>
> public class IntSummaryStatistics implements IntConsumer {
>    private long count;
>    private long sum;
>    private int min = Integer.MAX_VALUE;
>    private int max = Integer.MIN_VALUE;
>
>    /**
>     * Construct an empty instance with zero count, zero sum,
>     * {@code Integer.MAX_VALUE} min, {@code Integer.MIN_VALUE} max and zero
>     * average.
>     */
>    public IntSummaryStatistics() { }
>
>    /**
>     * Records a new value into the summary information
>     *
>     * @param value the input value
>     */
>    @Override
>    public void accept(int value) {
>        ++count;
>        sum += value;
>        min = Math.min(min, value);
>        max = Math.max(max, value);
>    }
>
>    /**
>     * Combines the state of another {@code IntSummaryStatistics} into this one.
>     *
>     * @param other another {@code IntSummaryStatistics}
>     * @throws NullPointerException if {@code other} is null
>     */
>    public void combine(IntSummaryStatistics other) {
>        count += other.count;
>        sum += other.sum;
>        min = Math.min(min, other.min);
>        max = Math.max(max, other.max);
>    }
> }
```