Stream.max (Integer :: max): неожиданный результат [дубликат]

На этот вопрос уже есть ответ здесь:

.Min () и .max () потока Java 8: почему это компилируется? 5 ответов

Я учусь на1z0-809: Java SE 8 Programmer II используя тесты Enthuware.

Столкнувшись с этим вопросом.

List<Integer> ls = Arrays.asList(3,4,6,9,2,5,7);

System.out.println(ls.stream().reduce(Integer.MIN_VALUE, (a, b)->a>b?a:b)); //1
System.out.println(ls.stream().max(Integer::max).get()); //2
System.out.println(ls.stream().max(Integer::compare).get()); //3
System.out.println(ls.stream().max((a, b)->a>b?a:b)); //4   

Какое из приведенных выше утверждений будет напечатано 9?

Ответ

1 и 3

Но есть кое-что еще. Я не понимаю почему

System.out.println(ls.stream().max(Integer::max).get()); // PRINTS 3

Я пытался отладить его с помощьюpeek но это не помогает мне понять.

Я пытался сортироватьls с помощьюInteger::max а такжеInteger::compare

ls.sort(Integer::max);     // [3, 4, 6, 9, 2, 5, 7]
ls.sort(Integer::compare); // [2, 3, 4, 5, 6, 7, 9]

Конечно, я понимаю, чтоInteger::max не является компаратором, следовательно, он имеет одну и ту же сигнатуру. Для меня,max должно быть7 в первом случае, так как это последний элемент, как, когда я сортировал сÌnteger::compare

Может ли кто-нибудь разбить это на что-то простое?

Ответы на вопрос(0)

Ваш ответ на вопрос