Так что, как уже говорилось ранее, вы просто неправильно сравниваете два подхода.
но я начал использовать collectAndThen и обнаружил, что это занимает немного больше времени по сравнению с другими процедурами кодирования, которые я использовал для выполнения подобных задач.
Вот мой код:
System.out.println("CollectingAndThen");
Long t = System.currentTimeMillis();
String personWithMaxAge = persons.stream()
.collect(Collectors.collectingAndThen(
Collectors.maxBy(Comparator.comparing(Person::getAge)),
(Optional<Person> p) -> p.isPresent() ? p.get().getName() : "none"
));
System.out.println("personWithMaxAge - "+personWithMaxAge + " time taken = "+(System.currentTimeMillis() - t));
Long t2 = System.currentTimeMillis();
String personWithMaxAge2 = persons.stream().sorted(Comparator.comparing(Person::getAge).reversed())
.findFirst().get().name;
System.out.println("personWithMaxAge2 : "+personWithMaxAge2+ " time taken = "+(System.currentTimeMillis() - t2));
И вот он вывод:
CollectingAndThen
personWithMaxAge - Peter time taken = 17
personWithMaxAge2 : Peter time taken = 1
который показывает, что сбор и затем занимает больше времени сравнительно.
Поэтому мой вопрос - стоит ли продолжать собирать и потом, или есть какие-то другие предложения?