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();
Tagir Valeev
sumber
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));
Penggenggam
sumber
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();
Olexandra Dmytrenko
sumber
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);
golubtsoff
sumber
0

Dengan streaming dan kurangi

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

Sruthi
sumber
Anda harus mulai dari Integer.MIN_VALUEmembuatnya bekerja dengan angka negatif.
Didier L