Saya mencoba menemukan cara sederhana di Java 8 stream API untuk melakukan pengelompokan, saya keluar dengan cara yang rumit ini!
List<String> list = new ArrayList<>();
list.add("Hello");
list.add("Hello");
list.add("World");
Map<String, List<String>> collect = list.stream().collect(
Collectors.groupingBy(o -> o));
System.out.println(collect);
List<String[]> collect2 = collect
.entrySet()
.stream()
.map(e -> new String[] { e.getKey(),
String.valueOf(e.getValue().size()) })
.collect(Collectors.toList());
collect2.forEach(o -> System.out.println(o[0] + " >> " + o[1]));
Saya menghargai masukan Anda.
java
functional-programming
java-8
Muhammad Hewedy
sumber
sumber
Jawaban:
Saya pikir Anda hanya mencari kelebihan yang dibutuhkan orang lain
Collector
untuk menentukan apa yang harus dilakukan dengan masing-masing kelompok ... dan kemudianCollectors.counting()
melakukan penghitungan:Hasil:
(Ada juga kemungkinan menggunakan
groupingByConcurrent
untuk efisiensi lebih. Sesuatu yang perlu diingat untuk kode asli Anda, jika itu akan aman dalam konteks Anda.)sumber
and then performing a reduction operation on the values associated with a given key using the specified downstream Collector
Map<String, Long> counted = list.stream() .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
, apa yang sebenarnya terjadi pada titik ini dan tautan apa pun dengan penjelasan lebih lanjut terkait dengan topik yang dapat dikirimsumber
Berikut adalah contoh untuk daftar Objek
sumber
Berikut adalah beberapa opsi untuk menyelesaikan tugas yang ada.
menggunakan
toMap
:menggunakan
Map::merge
:sumber
Inilah solusi sederhana dari StreamEx
Kurangi kode boilerplate:
collect(Collectors.
sumber
Jika Anda terbuka untuk menggunakan perpustakaan pihak ketiga, Anda bisa menggunakan
Collectors2
kelas di Eclipse Collections untuk mengonversiList
menjadiBag
menggunakanStream
. ABag
adalah struktur data yang dibangun untuk penghitungan .Keluaran:
Dalam kasus ini, Anda cukup
collect
yangList
langsung keBag
.Anda juga dapat membuat
Bag
tanpa menggunakanStream
dengan mengadaptasiList
dengan protokol Koleksi Eclipse.atau dalam kasus khusus ini:
Anda juga bisa langsung membuat Tas.
A
Bag<String>
sepertiMap<String, Integer>
di dalam yang secara internal melacak kunci dan jumlah mereka. Tetapi, jika Anda memintaMap
kunci yang tidak dikandungnya, itu akan kembalinull
. Jika Anda memintaBag
kunci yang tidak digunakanoccurrencesOf
, ia akan mengembalikan 0.Catatan: Saya pengendara untuk Eclipse Collections.
sumber