Java 8'de akışı kullanarak bir Tamsayıdan maksimum değer nasıl bulunur?


Yanıtlar:


205

Akışı şunlara dönüştürebilirsiniz IntStream:

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

Veya doğal düzen karşılaştırıcısını belirtin:

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

Veya azaltma işlemini kullanın:

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

Veya toplayıcı kullanın:

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

Veya IntSummaryStatistics'i kullanın:

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

16
Hangisinin daha verimli olduğunu bilmek ilginç olurdu.
Roland

2
Neden diye sorabilir miyim Tagir?
seçilen

23
@elect, önce tüm tam sayıların kutularını kaldırır, ardından kutusuz olanları karşılaştırır. 2., 3. ve 4. çözümler, her karşılaştırmada kutudan çıkarmayı iki kat daha fazla kutudan çıkarma işlemi yaparak etkili bir şekilde yapar. Sonuncusu, burada gereksiz olan daha fazla istatistik (toplam ve dakika gibi) hesaplar, ancak kesinlikle biraz zaman alacaktır.
Tagir Valeev

Sadece bir almak istiyorsanız int, o zaman mapToInt(...).max().getAsInt()veya reduce(...).get()yöntem zincirlerine
Andrejs 6'17

1
@Bogdan, bu çözülebilir, ancak görünüşe göre söz konusu gerekli değildi. Yine de bu durumu kapsayan kendi cevabınızı gönderebilirsiniz.
Tagir Valeev

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

8
Bu, yalnızca tüm değerleriniz pozitifse işe yarar. Azalt () 'da 0 yerine Tamsayı.MIN_VALUE kullanın.
rolika

3

Başka bir versiyon şunlar olabilir:

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

3

Doğru kod:

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

veya

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

0

Akışla ve azaltın

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

Görünüşe göre bu yanıtı iki kez göndermiş ve diğerini kaldırmışsınız, ancak diğerine yorum yaptığım gibi, bu çözüm zaten Tagir'in cevabına dahil edilmiştir ( Integer::maxama bu tamamen aynıdır).
Didier L

0

Ayrıca aşağıdaki kodu da kullanabilirsiniz:

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

Başka bir alternatif:

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
OP'nin sorusunu sağlayan başka cevaplar da var ve bunlar yıllar önce yayınlandı. Bir yanıt gönderirken, lütfen özellikle eski soruları yanıtlarken yeni bir çözüm veya çok daha iyi bir açıklama eklediğinizden emin olun.
help-info.de

-2

İnt max = Stream.of (1,2,3,4,5) .reduce (0, (a, b) -> Math.max (a, b)); hem pozitif hem de negatif sayılar için çalışır


Integer.MIN_VALUENegatif sayılarla çalışması için baştan başlamalısınız .
Didier L
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.