¿Cómo encontrar el valor máximo de un entero usando stream en java 8?


Respuestas:


205

Puede convertir la transmisión a IntStream:

OptionalInt max = list.stream().mapToInt(Integer::intValue).max();

O especifique el comparador de orden natural:

Optional<Integer> max = list.stream().max(Comparator.naturalOrder());

O utilice la operación de reducción:

Optional<Integer> max = list.stream().reduce(Integer::max);

O use el colector:

Optional<Integer> max = list.stream().collect(Collectors.maxBy(Comparator.naturalOrder()));

O use IntSummaryStatistics:

int max = list.stream().collect(Collectors.summarizingInt(Integer::intValue)).getMax();

16
Sería interesante saber cuál es más eficiente.
Roland

2
¿Puedo preguntar por qué, Tagir?
elija el

23
@elect, primero desempaqueta todos los enteros y luego compara los que no están empaquetados. Las soluciones 2ª, 3ª y 4ª realizan el desempaquetado en cada comparación haciendo de manera efectiva el doble de operaciones de desempaquetado. El último calcula más estadísticas (como suma y min), lo cual es innecesario aquí, pero seguramente llevará algo de tiempo.
Tagir Valeev

Si solo desea obtener un int, entonces mapToInt(...).max().getAsInt()o reduce(...).get()las cadenas de métodos
Andrejs

1
@Bogdan, esto se puede resolver, aunque aparentemente no se requería en cuestión. Sin embargo, puede publicar su propia respuesta que cubra esta situación.
Tagir Valeev

10
int max = list.stream().reduce(Integer.MIN_VALUE, (a, b) -> Integer.max(a, b));

8
Esto solo funciona si todos sus valores son positivos. Utilice Integer.MIN_VALUE en lugar de 0 en reduce ().
rolika

3

Otra versión podría ser:

int maxUsingCollectorsReduce = list.stream().collect(Collectors.reducing(Integer::max)).get();

3

Código correcto:

int max = list.stream().reduce(Integer.MIN_VALUE, (a, b) -> Integer.max(a, b));

o

int max = list.stream().reduce(Integer.MIN_VALUE, Integer::max);

0

Con corriente y reducir

Optional<Integer> max = list.stream().reduce(Math::max);

Parece que publicó esta respuesta dos veces y eliminó la otra, pero como comenté en la otra, esta solución ya está incluida en la respuesta de Tagir (con Integer::maxpero eso es exactamente lo mismo).
Didier L

0

También puede utilizar el siguiente código recortado:

int max = list.stream().max(Comparator.comparing(Integer::valueOf)).get();

Otra alternativa:

list.sort(Comparator.reverseOrder()); // max value will come first
int max = list.get(0);  

0
int value = list.stream().max(Integer::compareTo).get();
System.out.println("value  :"+value );

3
Hay otras respuestas que proporcionan la pregunta del OP y se publicaron hace muchos años. Cuando publique una respuesta, asegúrese de agregar una nueva solución o una explicación sustancialmente mejor, especialmente al responder preguntas más antiguas.
help-info.de

-2

Puede usar int max = Stream.of (1,2,3,4,5) .reduce (0, (a, b) -> Math.max (a, b)); funciona tanto para números positivos como negativos


Debes comenzar desde Integer.MIN_VALUEpara que funcione con números negativos.
Didier L
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.