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();
Tagir Valeev
la source
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));
Pince
la source
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();
Olexandra Dmytrenko
la source
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);
Golubtsoff
la source
0

Avec stream et réduire

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

Sruthi
la source
Vous devriez commencer par Integer.MIN_VALUEle faire fonctionner avec des nombres négatifs.
Didier L