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
Может ли кто-нибудь разбить это на что-то простое?