How to force max to return ALL maximum values in a Java Stream?

collections, java, java-8, java-stream, lambda

Solution

I would group by value and store the values into a `TreeMap` in order to have my values sorted, then I would get the max value by getting the last entry as next:

Stream.of(1, 3, 5, 3, 2, 3, 5)
    .collect(groupingBy(Function.identity(), TreeMap::new, toList()))
    .lastEntry()
    .getValue()
    .forEach(System.out::println);

Output:

5
5

Problem

I've tested a bit the `max` function on Java 8 lambdas and streams, and it seems that in case `max` is executed, even if more than one object compares to 0, it returns an arbitrary element within the tied candidates without further consideration. Is there an evident trick or function for such a max expected behavior, so that all max values are returned? I don't see anything in the API but I am sure it must exist something better than comparing manually. For instance: ``` // myComparator is an IntegerComparator Stream.of(1, 3, 5, 3, 2, 3, 5) .max(myComparator) .forEach(System.out::println); // Would print 5, 5 in any order. ```

Original source

Related problems