como encontrar o valor máximo de um inteiro usando stream em java 8?

Respostas:

203

Você pode converter o stream para IntStream:

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

Ou especifique o comparador de ordem natural:

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

Ou use a operação de redução:

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

Ou use o coletor:

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

Ou use IntSummaryStatistics:

int max = list.stream().collect(Collectors.summarizingInt(Integer::intValue)).getMax();
Tagir Valeev
fonte
16
Seria interessante saber qual é o mais eficiente.
Roland
2
Posso perguntar por quê, Tagir?
eleita de
23
@elect, ele primeiro desempacota todos os inteiros e depois compara os não encaixotados. As 2ª, 3ª e 4ª soluções fazem o unboxing em cada comparação, fazendo o dobro de operações de unboxing. O último calcula mais estatísticas (como soma e min), o que é desnecessário aqui, mas certamente levará algum tempo.
Tagir Valeev
Se você quiser apenas obter um int, então mapToInt(...).max().getAsInt()ou reduce(...).get()para as cadeias de métodos
Andrejs
1
@Bogdan, isso pode ser resolvido, embora aparentemente não fosse necessário em questão. No entanto, você pode postar sua própria resposta cobrindo esta situação.
Tagir Valeev
10
int max = list.stream().reduce(Integer.MIN_VALUE, (a, b) -> Integer.max(a, b));
Garra
fonte
8
Isso funciona apenas se todos os seus valores forem positivos. Use Integer.MIN_VALUE em vez de 0 em reduce ().
rolika
3

Outra versão poderia ser:

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

Código correto:

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

ou

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

Com fluxo e redução

Optional<Integer> max = list.stream().reduce(Math::max);
Michal Kalman
fonte
Parece que você postou essa resposta duas vezes e removeu a outra, mas como comentei na outra, essa solução já está incluída na resposta do Tagir (com Integer::maxmas é exatamente o mesmo).
Didier L
0

Você também pode usar o código abaixo:

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

Outra alternativa:

list.sort(Comparator.reverseOrder()); // max value will come first
int max = list.get(0);  
Vaseph
fonte
0
int value = list.stream().max(Integer::compareTo).get();
System.out.println("value  :"+value );
Shalika
fonte
3
Existem outras respostas que fornecem a pergunta do OP, e elas foram publicadas há muitos anos. Ao postar uma resposta, certifique-se de adicionar uma nova solução ou uma explicação substancialmente melhor, especialmente ao responder a perguntas mais antigas.
help-info.de
-2

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

Sruthi
fonte
Você deve começar de Integer.MIN_VALUEpara fazê-lo funcionar com números negativos.
Didier L