import java.util.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<Container<Dto>> list = Arrays.asList(
new Container<>(new Dto("A"), 10L),
new Container<>(new Dto("A"), 30L),
new Container<>(new Dto("B"), 30L));
Map<String, Optional<Long>> mapCorrect = list.stream()
.collect(Collectors.groupingBy(
c -> c.getOutput().getType(),
Collectors.mapping(Container::getDifference, Collectors.maxBy(Comparator.comparingLong(l -> l)))));
System.out.println(mapCorrect);
Map<String, Optional<Long>> mapWrong = list.stream()
.collect(Collectors.groupingBy(
c -> c.getOutput().getType(),
Collectors.mapping(Container::getDifference, Collectors.maxBy(Comparator.naturalOrder()))));
System.out.println(mapWrong);
}
public static class Container<T> {
T output;
Long difference;
public Container(T output, Long difference) {
this.output = output;
this.difference = difference;
}
public T getOutput() {
return output;
}
public Long getDifference() {
return difference;
}
}
public static class Dto {
String type;
public Dto(String type) {
this.type = type;
}
public String getType() {
return type;
}
}
}