from - stream() max java
Stream.max(Integer:: max): resultado inesperado (3)
El contrato de un método de comparación (en los argumentos first
, second
) es:
- devuelve 0 si
first
es igual asecond
- devuelve valor negativo si
first < second
- devuelve un valor positivo si
first > second
El método max
con solo valores positivos siempre devolverá un valor positivo. Al interpretar el valor de retorno según el contrato del comparador, un valor positivo significa first > second
. Como resultado, el orden de los artículos no cambiará, parecen estar "ordenados".
Esta pregunta ya tiene una respuesta aquí:
Estoy estudiando para 1z0-809: Java SE 8 Programmer II usando los simulacros de Enthuware.
Encontrando esta pregunta.
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
¿Cuál de las afirmaciones anteriores imprimirá 9?
La respuesta es
1 y 3
Pero hay algo más. No entiendo por qué
System.out.println(ls.stream().max(Integer::max).get()); // PRINTS 3
Intenté depurarlo con un peek
pero no me ayudó a entenderlo.
Traté de ordenar ls
usando Integer::max
y Integer::compare
ls.sort(Integer::max); // [3, 4, 6, 9, 2, 5, 7]
ls.sort(Integer::compare); // [2, 3, 4, 5, 6, 7, 9]
Por supuesto, entiendo que Integer::max
no es un Comparador, por lo tanto, tiene la misma firma de uno. Para mí, max
debe ser 7
en el primer caso ya que es el último elemento como cuando Ìnteger::compare
con Ìnteger::compare
¿Podría alguien dividirlo en algo simple?
Esto es increíblemente confuso.
Estamos intentando usar Integer::max
como un comparador. Dado que todos los números en la pregunta son positivos, la respuesta siempre se interpreta como que el primer argumento de compare(a, b)
es "mayor" que el segundo.
Una peculiaridad de Collections.sort
es que cuando tienes una lista [a, b]
, el método está programado de tal manera que se llama compare(b, a)
que se llama, en lugar de compare(a, b)
(que parecería más sensato). Por lo tanto, si compare
devuelve un número positivo, se ve como b > a
, por lo que la lista no necesita clasificación.
Es por eso que list.sort
no hace nada.
Sin embargo, sucede que Stream.max
está programado al revés, es decir, la primera comparación es compare(3, 4)
, por lo que parece que 3
es el máximo.
Integer.max(a, b)
devolverá el mayor valor del dado a
y b
. Si usa ese resultado de alguna manera como un comparador, se considerará que a > b
valor positivo devuelto significa que a > b
se mantendrá.
Los primeros dos elementos son 3 y 4. Ambos son positivos. Integer.max(3, 4) = 4 > 0
. Entonces, de hecho estás diciendo que 3 > 4
con un comparador así, 3 se mantienen. Luego, lo mismo vale para el resto: Integer.max(3, 6) = 6 > 0
, por lo que 3 se considera el máximo, etc.