Вам просто нужно отсортировать записи, а не отображать их значение в double
, например:
Map<String, List<MyObject>> sortedByAverageOne = groupByFieldText.entrySet().stream()
.sorted(Comparator.comparingDouble(e -> average(e, MyObject::getDoubleOne)))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
(v1, v2) -> v1, LinkedHashMap::new));
Обратите внимание, что если у вас много записей, это будет не очень эффективно, потому что оно вызывает average
для каждого сравнения.
Затем, имея такую отсортированную карту, вы печатаете ее следующим образом:
sortedByAverageOne.entrySet().stream()
.map(e -> String.format(
"%s → %f → %f → %f",
e.getKey(),
average(e, MyObject::getDoubleOne),
average(e, MyObject::getDoubleTwo),
average(e, MyObject::getDoubleThree)
))
.forEach(System.out::println);
Наконец, average
определяется как:
private static double average(Map.Entry<String, List<MyObject>> entry, ToDoubleFunction<MyObject> getter) {
return average(entry.getValue(), getter);
}
private static double average(List<MyObject> list, ToDoubleFunction<MyObject> getter) {
return list.stream().mapToDouble(getter).average().orElse(0);
}