Chcę przekonwertować:
Map<String, Map<String, List<Map<String, String>>>> inputMap
do:
Map<String, Map<String, CustomObject>> customMap
inputMap
jest podany w konfiguracji i jest gotowy, ale muszę customMap
sformatować. CustomObject zostanie wyprowadzony z List<Map<String, String>>
użycia kilku wierszy kodu w funkcji.
Próbowałem normalnego sposobu iteracji mapy wejściowej i kopiowania kluczowych wartości w customMap. Czy jest jakiś skuteczny sposób, aby to zrobić za pomocą Java 8 lub innego skrótu?
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
ghostrider
źródło
źródło
Odpowiedzi:
Jednym z rozwiązań jest strumieniowo
entrySet
zinputMap
, a następnie za pomocąCollectors#toMap
podwójnie (raz na zewnętrznejMap
, a raz na wewnętrznyMap
):źródło
{}
wyrażenie i zwrot w lambda, coś takiego:.collect(Collectors.toMap(Function.identity(), entry -> entry.getValue() .entrySet() .stream() .collect(Collectors.toMap(Function.identity(), entry -> getCustomeObj(entry.getValue()))); ));
Możesz przesyłać strumieniowo, ale nie będzie to czytelne; przynajmniej dla mnie. Więc jeśli masz metodę:
nadal możesz użyć
java-8
składni, ale w innej formie:Jeśli możesz zrobić wewnętrzną mapę
immutable
, możesz ją jeszcze skrócić:źródło
Streaming IMHO nie jest taki zły. Nie ma złych narzędzi. To zależy od tego, jak ich używasz.
W tym konkretnym przypadku wyodrębnię powtarzalny wzór do metody użyteczności:
Powyższą metodę można wdrożyć przy użyciu dowolnego podejścia, choć myślę, że
Stream API
pasuje tutaj całkiem dobrze.Po zdefiniowaniu metody użyteczności można jej użyć w następujący sposób:
Rzeczywista transformacja to w rzeczywistości jeden liniowiec. Więc z właściwą
JavaDoc
dlatransformValues
sposobu kod wynik jest dość czytelne i utrzymaniu.źródło
Co powiesz
Collectors.toMap
na wpisy zarówno na poziomie zewnętrznym, jak i wewnętrznym, takie jak:źródło