Saya ingin menjumlahkan daftar bilangan bulat. Ini berfungsi sebagai berikut, tetapi sintaksnya terasa tidak benar. Bisakah kode dioptimalkan?
Map<String, Integer> integers;
integers.values().stream().mapToInt(i -> i).sum();
java
java-8
java-stream
anggota
sumber
sumber
mapToLong
untuk menghindari luapan, tergantung pada nilai yang bisa dimiliki peta Anda.i -> i
sangat jelas, secara pribadi. Ya, Anda perlu tahu bahwa nilainya akan secara otomatis terbuka, tapi itu benar sejak Java 5 ...foo(int i)
tidak menulisfoo(myInteger.intValue());
setiap kali mereka menyebutnya (atau setidaknya saya harapkan tidak !!). Saya setuju dengan Anda yangInteger::intValue
lebih eksplisit tetapi saya pikir hal yang sama berlaku di sini. Orang-orang harus mempelajarinya sekali saja dan kemudian selesai :-). Ini tidak seperti jika itu suatu kebingungan ajaib.i -> i
sepertinya tidak ada op dan secara konsep, itu adalah no-op. Tentu saja, di bawah tendaInteger.intValue()
dipanggil, tetapi bahkan lebih dalam di bawah tenda, metode-metode tersebut diuraikan menjadi persis no-op yang terlihat seperti dalam kode sumber.Integer::intValue
memiliki poin bonus tidak membuat metode sintetik dalam kode byte tetapi bukan itu yang harus mengarahkan keputusan Anda tentang bagaimana mengatur kode sumber Anda.Jawaban:
Ini akan bekerja, tetapi
i -> i
melakukan beberapa unboxing otomatis yang mengapa "terasa" aneh. Salah satu dari yang berikut ini akan berfungsi dan lebih baik menjelaskan apa yang dilakukan kompiler di bawah tenda dengan sintaks asli Anda:sumber
BigDecimal sum = numbers.stream().reduce(BigDecimal.ZERO, BigDecimal::add);
Saya menyarankan 2 opsi lagi:
Yang kedua menggunakan
Collectors.summingInt()
kolektor, ada jugasummingLong()
kolektor yang akan Anda gunakanmapToLong
.Dan opsi ketiga: Java 8 memperkenalkan
LongAdder
akumulator yang sangat efektif yang dirancang untuk mempercepat peringkasan dalam aliran paralel dan lingkungan multi-utas. Di sini, inilah contoh penggunaannya:sumber
Dari dokumen
Jadi, untuk peta Anda akan menggunakan:
Atau:
sumber
Anda dapat menggunakan metode pengurangan:
atau
sumber
int
itu, yaituInteger::sum
Long::sum
daripadaInteger::sum
.Anda dapat menggunakan
reduce()
untuk menjumlahkan daftar bilangan bulat.sumber
Anda dapat menggunakan metode kumpulkan untuk menambahkan daftar bilangan bulat.
sumber
Ini akan menjadi cara terpendek untuk meringkas
int
jenis array (untuklong
arrayLongStream
, untukdouble
arrayDoubleStream
dan sebagainya). Namun tidak semua tipe integer primitif atau floating pointStream
diimplementasikan.sumber
IntStream.of()
tidak akan bekerja untuk masalah ini, kecuali jika kita membuat sesuatu yang menyeramkan seperti ini:IntStream.of( integers.values().stream().mapToInt( Integer::intValue ).toArray() ).sum();
integers.values().stream().mapToInt( Integer::intValue ).sum()
.Semoga ini membantu mereka yang memiliki objek dalam daftar.
Jika Anda memiliki daftar objek dan ingin menjumlahkan bidang tertentu dari objek ini gunakan di bawah ini.
sumber
Saya telah mendeklarasikan daftar Integer.
Anda dapat mencoba menggunakan berbagai cara di bawah ini.
Menggunakan
mapToInt
Menggunakan
summarizingInt
Menggunakan
reduce
sumber
sumber
Sebagian besar aspek tercakup. Tetapi mungkin ada persyaratan untuk menemukan agregasi tipe data lain selain dari Integer, Long (yang sudah disediakan dukungan aliran khusus). Untuk mis. Stram dengan BigInteger Untuk tipe seperti itu kita dapat menggunakan seperti mengurangi operasi
list.stream (). kurangi ((bigInteger1, bigInteger2) -> bigInteger1.add (bigInteger2))
sumber