Неверный ожидаемый результат как «3 3» вместо «3 5», используя max и min из потоков - PullRequest
1 голос
/ 01 мая 2020

У меня есть следующий код

List<Integer> li = new ArrayList<Integer>();
li.add(3);li.add(5);
Stream at = li.stream();
Optional<Integer> o = at.min(Comparator.naturalOrder());
if (o.isPresent()) {System.out.println(o.get());}
Stream gt = li.stream();
Optional<Integer> i = gt.max(Comparator.reverseOrder());
System.out.println(i.get());

Почему я получаю вывод как «3 3» вместо «3 5». Пожалуйста, уточните.

1 Ответ

0 голосов
/ 01 мая 2020

Причиной этого является Comparator. Вы переворачиваете элементы после сортировки и получаете max из них. Конечно, обратный max - это min, и вы получите тот же результат.

Решение было бы заменить

Optional<Integer> i = gt.max(Comparator.reverseOrder());

на

Optional<Integer> i = gt.max(Comparator.naturalOrder());

В несколько ином аспекте, когда вы ищете и max, и min из целочисленного потока одновременно можно использовать сводную статистику из JDK. Это выглядит примерно так -

IntSummaryStatistics statistics = li.stream().mapToInt(i -> i).summaryStatistics();
int max = statistics.getMax();
int min = statistics.getMin();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...