Map<String, String> phoneBook = people.stream()
.collect(toMap(Person::getName,
Person::getAddress));
Saya dapatkan java.lang.IllegalStateException: Duplicate key
ketika elemen digandakan ditemukan.
Apakah mungkin untuk mengabaikan pengecualian seperti itu dalam menambahkan nilai ke peta?
Ketika ada duplikat itu harus dilanjutkan dengan mengabaikan kunci duplikat itu.
java
java-8
java-stream
Patan
sumber
sumber
Jawaban:
Ini dimungkinkan menggunakan
mergeFunction
parameterCollectors.toMap(keyMapper, valueMapper, mergeFunction)
:mergeFunction
adalah fungsi yang beroperasi pada dua nilai yang terkait dengan kunci yang sama.adress1
sesuai dengan alamat pertama yang ditemui ketika mengumpulkan elemen danadress2
sesuai dengan alamat kedua yang ditemui: lambda ini hanya memberitahu untuk menjaga alamat pertama dan mengabaikan yang kedua.sumber
null
. Lihat dokumen toMap yang menunjuk untuk menggabungkan dokumen yang menyatakan Jika fungsi pemetaan kembali nol, pemetaan dihapus.Seperti yang dikatakan dalam JavaDocs :
Jadi sebaiknya Anda gunakan
toMap(Function keyMapper, Function valueMapper, BinaryOperator mergeFunction)
saja. Cukup berikan fungsi penggabungan , yang akan menentukan duplikat mana yang diletakkan di peta.Misalnya, jika Anda tidak peduli yang mana, hubungi saja
sumber
Jawaban @alaster banyak membantu saya, tetapi saya ingin menambahkan informasi yang berarti jika seseorang mencoba mengelompokkan informasi tersebut.
Jika Anda memiliki, misalnya, dua
Orders
dengan produk yang samacode
tetapi berbedaquantity
untuk masing-masing, dan keinginan Anda adalah jumlah jumlahnya, Anda dapat melakukannya:Hasil:
sumber
Untuk dikelompokkan berdasarkan Objek
sumber
Untuk orang lain yang mendapatkan masalah ini tetapi tanpa kunci duplikat di peta yang dialirkan, pastikan fungsi keyMapper Anda tidak mengembalikan nilai nol .
Sangat menjengkelkan untuk melacak ini karena kesalahannya akan mengatakan "Duplicate key 1" ketika 1 sebenarnya nilai entri, bukan kunci.
Dalam kasus saya, fungsi keyMapper saya mencoba mencari nilai di peta yang berbeda, tetapi karena kesalahan ketik dalam string mengembalikan nilai nol.
sumber
Saya telah mengalami masalah seperti itu ketika mengelompokkan objek, saya selalu menyelesaikannya dengan cara sederhana: melakukan filter kustom menggunakan java.util.Set untuk menghapus objek duplikat dengan atribut apa pun pilihan Anda seperti di bawah ini
Semoga ini bisa membantu siapa pun yang memiliki masalah yang sama!
sumber
Anggap Anda memiliki orang adalah Daftar objek
Sekarang Anda membutuhkan dua langkah:
1)
2)
Berikut adalah metode untuk menghapus duplikat
Menambahkan contoh lengkap di sini
Hasil:
sumber