bagaimana menemukan nilai maksimum dari Integer menggunakan aliran di java 8?


Jawaban:


205

Anda dapat mengonversi aliran menjadi IntStream:

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

Atau tentukan pembanding tatanan alami:

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

Atau gunakan pengurangan operasi:

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

Atau gunakan kolektor:

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

Atau gunakan IntSummaryStatistics:

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

16
Akan menarik untuk mengetahui mana yang lebih efisien.
Roland

2
Bolehkah saya bertanya mengapa, Tagir?
pilih

23
@elect, ini pertama-tama akan membuka semua bilangan bulat, lalu membandingkan yang tidak dikotak. Solusi ke-2, ke-3, dan ke-4 melakukan unboxing pada setiap perbandingan secara efektif melakukan operasi unboxing dua kali lebih banyak. Yang terakhir menghitung lebih banyak statistik (seperti jumlah dan menit) yang tidak diperlukan di sini, tetapi pasti akan memakan waktu.
Tagir Valeev

Jika Anda hanya ingin mendapatkan int, maka mapToInt(...).max().getAsInt()atau reduce(...).get()ke rantai metode
Andrejs

1
@ Bogdan, ini bisa diselesaikan, meskipun tampaknya tidak diperlukan dalam pertanyaan. Namun demikian, Anda dapat memposting jawaban Anda sendiri yang mencakup situasi ini.
Tagir Valeev

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

8
Ini hanya berhasil, jika semua nilai Anda positif. Gunakan Integer.MIN_VALUE alih-alih 0 dalam reduce ().
rolika

3

Versi lain bisa jadi:

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

3

Kode yang benar:

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

atau

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

0

Dengan streaming dan kurangi

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

Sepertinya Anda memposting jawaban ini dua kali dan menghapus yang lain, tetapi ketika saya mengomentari yang lain, solusi ini sudah termasuk dalam jawaban Tagir (dengan Integer::maxtetapi itu persis sama).
Didier L

0

Anda juga dapat menggunakan kode di bawah ini yang dipotong:

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

Alternatif lain:

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
Ada jawaban lain yang memberikan pertanyaan OP, dan jawaban itu diposting beberapa tahun yang lalu. Saat memposting jawaban, pastikan Anda menambahkan solusi baru, atau penjelasan yang jauh lebih baik, terutama saat menjawab pertanyaan lama.
help-info.de

-2

Anda bisa menggunakan int max = Stream.of (1,2,3,4,5) .reduce (0, (a, b) -> Math.max (a, b)); berfungsi untuk bilangan positif dan negatif


Anda harus mulai dari Integer.MIN_VALUEmembuatnya bekerja dengan angka negatif.
Didier L
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.