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();

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));

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();

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);

0

Com fluxo e redução

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

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);  

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

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


Você deve começar de Integer.MIN_VALUEpara fazê-lo funcionar com números negativos.
Didier L
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.