void (String ... args) { Map<Stuff.Type, Optional<Stuff>> bar = elems() .stream() .collect(groupingBy(Stuff::getType, reducing((d1, d2) -> d1.getValue() > d2.getValue() ? d1 : d2))); System.out.println(bar); Map<Stuff.Type, Stuff> baz = elems() .stream() .collect(groupingBy(Stuff::getType, collectingAndThen(reducing((Stuff d1, Stuff d2) -> d1.getValue() > d2.getValue() ? d1 : d2), Optional::get))); System.out.println(baz); }