comment trouver la valeur maximale d'un entier en utilisant le flux dans java 8?


Réponses:


203

Vous pouvez soit convertir le flux en IntStream:

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

Ou spécifiez le comparateur d'ordre naturel:

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

Ou utilisez l'opération de réduction:

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

Ou utilisez le collecteur:

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

Ou utilisez IntSummaryStatistics:

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

16
Il serait intéressant de savoir lequel est le plus efficace.
Roland

2
Puis-je demander pourquoi, Tagir?
élire

23
@elect, il déballe d'abord tous les entiers, puis compare ceux qui ne sont pas encadrés. Les 2e, 3e et 4e solutions effectuent le déballage sur chaque comparaison en effectuant efficacement deux fois plus d'opérations de déballage. Le dernier calcule plus de statistiques (comme sum et min), ce qui n'est pas nécessaire ici, mais prendra sûrement un certain temps.
Tagir Valeev

Si vous voulez simplement obtenir un int, alors mapToInt(...).max().getAsInt()ou reduce(...).get()les chaînes de méthodes
Andrejs

1
@Bogdan, cela peut être résolu, bien que ce n'était apparemment pas nécessaire en question. Néanmoins, vous pouvez poster votre propre réponse sur cette situation.
Tagir Valeev du

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

8
Cela ne fonctionne que si toutes vos valeurs sont positives. Utilisez Integer.MIN_VALUE au lieu de 0 dans Reduce ().
rolika

3

Une autre version pourrait être:

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

3

Code correct:

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

Avec stream et réduire

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

Il semble que vous ayez posté cette réponse deux fois et supprimé l'autre, mais comme j'ai commenté l'autre, cette solution est déjà incluse dans la réponse de Tagir (avec Integer::maxmais c'est exactement la même chose).
Didier L

0

Vous pouvez également utiliser le code ci-dessous extrait:

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

Une autre alternative:

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
Il y a d'autres réponses qui fournissent la question du PO, et elles ont été affichées il y a de nombreuses années. Lorsque vous publiez une réponse, assurez-vous d'ajouter soit une nouvelle solution, soit une explication nettement meilleure, en particulier lorsque vous répondez à des questions plus anciennes.
help-info.de

-2

Vous pouvez utiliser int max = Stream.of (1,2,3,4,5) .reduce (0, (a, b) -> Math.max (a, b)); fonctionne pour les nombres positifs et négatifs


Vous devriez commencer par Integer.MIN_VALUEle faire fonctionner avec des nombres négatifs.
Didier L
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.