from java java-8 compare max java-stream

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 a second
  • 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.