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


Bir listesi var Integer  list ve list.stream() Maksimum değeri istiyorum. En basit yol nedir? Karşılaştırıcıya ihtiyacım var mı?


50
2017-07-13 08:10


Menşei


Javadoc'u oku: docs.oracle.com/javase/8/docs/api/java/util/stream/..., docs.oracle.com/javase/8/docs/api/java/util/... - JB Nizet
Bir Akışı kullanmak için nedenleriniz olabilir, ancak unutmayın Collections.max.. - Alexis C.


Cevaplar:


Akışını IntStream:

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

Veya doğal sipariş karşılaştırıcısını belirtin:

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

Veya kullanımı azaltın:

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

Veya toplayıcıyı kullanın:

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

Ya da IntSummaryStatistics kullanın:

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

133
2017-07-13 08:41



Hangisinin daha verimli olduğunu bilmek ilginç olurdu. - Roland
@Roland Birinciye oy verecektim. - Tagir Valeev
Nedenini sorabilir miyim, Tagir? - elect
@elect, önce tüm tam sayıları çıkarır, sonra kutulu olmayanları karşılaştırır. 2., 3. ve 4. çözümler, her karşılaştırmada iki kat daha fazla boşaltma işlemini etkin bir şekilde yapıyor. Sonuncusu, burada gereksiz olan daha fazla istatistiği (toplam ve min. Gibi) hesaplar, fakat mutlaka biraz zaman alır. - Tagir Valeev
Eğer sadece bir int, sonra mapToInt(...).max().getAsInt() veya reduce(...).get() yöntem zincirlerine - Andrejs


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

8
2017-10-22 06:33



Bu, tüm değerleriniz olumluysa, sadece çalışır. Küçült () içinde 0 yerine Integer.MIN_VALUE değerini kullanın. - rolika


Başka bir versiyon şöyle olabilir:

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

3
2018-02-25 13:32





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

1
2018-04-25 10:09





Akışı ile ve azaltmak

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

1
2017-08-03 09:20



Bu cevabı iki kez yayınlamışsınız ve diğerini kaldırmışsınız gibi görünüyor, ama diğerine yorum yaptığım için, bu çözüm Tagir'in cevabına dahil edilmiş durumda. Integer::max ama tam olarak aynıdır). - Didier L


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


-2
2018-06-13 19:02



Negatif için çalışmıyor. - shmosel
Den başlamak gerekir Integer.MIN_VALUE Negatif sayılarla çalışmasını sağlamak. - Didier L