Saya ingin mengonversi:
Map<String, Map<String, List<Map<String, String>>>> inputMap
untuk:
Map<String, Map<String, CustomObject>> customMap
inputMap
disediakan dalam konfigurasi dan siap tetapi saya perlu customMap
memformat. CustomObject akan diturunkan dari List<Map<String, String>>
penggunaan beberapa baris kode dalam suatu fungsi.
Saya telah mencoba cara normal untuk mengulangi input peta dan menyalin nilai-nilai kunci di customMap. Apakah ada cara efisien untuk melakukan itu menggunakan Java 8 atau cara pintas lainnya?
Map<String, Map<String, List<Map<String, String>>>> configuredMap = new HashMap<>();
Map<String, Map<String, CustomObj>> finalMap = new HashMap<>();
for (Map.Entry<String, Map<String, List<Map<String, String>>>> attributeEntry : configuredMap.entrySet()) {
Map<String, CustomObj> innerMap = new HashMap<>();
for (Map.Entry<String, List<Map<String, String>>> valueEntry : attributeEntry.getValue().entrySet()) {
innerMap.put(valueEntry.getKey(), getCustomeObj(valueEntry.getValue()));
}
finalMap.put(attributeEntry.getKey(), innerMap);
}
private CustomObj getCustomeObj(List<Map<String, String>> list) {
return new CustomObj();
}
java
collections
java-8
java-stream
hantu pengendara
sumber
sumber
Jawaban:
Salah satu solusi adalah untuk streaming
entrySet
dariinputMap
, dan kemudian menggunakanCollectors#toMap
dua kali (sekali untuk bagian luarMap
, dan sekali untuk innerMap
):sumber
{}
dan mengembalikan pernyataan dalam lambda, sesuatu seperti ini:.collect(Collectors.toMap(Function.identity(), entry -> entry.getValue() .entrySet() .stream() .collect(Collectors.toMap(Function.identity(), entry -> getCustomeObj(entry.getValue()))); ));
Anda dapat melakukan streaming, tetapi itu tidak akan terlihat mudah dibaca; setidaknya bagi saya. Jadi, jika Anda memiliki metode:
Anda masih bisa menggunakan
java-8
sintaks, tetapi dalam bentuk yang berbeda:Jika Anda bisa membuat peta bagian dalam
immutable
, Anda bisa membuatnya lebih pendek:sumber
Streaming IMHO bukan ide yang buruk. Tidak ada alat yang buruk. Itu tergantung pada bagaimana Anda menggunakannya.
Dalam kasus khusus ini saya akan mengekstrak pola berulang menjadi metode utilitas:
Metode di atas dapat diimplementasikan dengan menggunakan pendekatan apa pun, meskipun saya pikir
Stream API
sangat cocok di sini.Setelah Anda mendefinisikan metode utilitas, itu dapat digunakan sesederhana berikut:
Transformasi aktual secara efektif adalah satu liner. Jadi dengan tepat
JavaDoc
untuktransformValues
metode kode hasil cukup mudah dibaca dan dipelihara.sumber
Bagaimana
Collectors.toMap
dengan entri baik di level luar dan dalam seperti:sumber