¿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();
Tagir Valeev
fuente
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));
Pinza
fuente
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();
Olexandra Dmytrenko
fuente
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);
golubtsoff
fuente
0

Con corriente y reducir

Optional<Integer> max = list.stream().reduce(Math::max);
Michal Kalman
fuente
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);  
Vaseph
fuente
0
int value = list.stream().max(Integer::compareTo).get();
System.out.println("value  :"+value );
Shalika
fuente
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

Sruthi
fuente
Debes comenzar desde Integer.MIN_VALUEpara que funcione con números negativos.
Didier L