Betrachten Sie das folgende Problem. Ich möchte die Liste der Karten in die Karte konvertieren.
Eingang
[
{a=1, b=2},
{a=3, d=4, e=5},
{a=5,b=6,e=7}
]
Ausgabe
{
a=[1,3,5],
b=[2,6],
d=[4],
e=[5,7]
}
Ich habe den folgenden Code ausprobiert.
Code
static <K,V> Map<K,List<V>> getMapFromTheList(List<Map<K,V>> list)
{
return list.stream().flatMap(map -> map.entrySet().stream())
.collect(Collectors.groupingBy(Map.Entry::getKey,Collectors.mapping(Map.Entry::getValue, Collectors.toList())));
}
Gibt es einen besseren Weg, dies zu tun? Einfacher oder effizienter?
Die Alternativen könnten folgendermaßen aussehen:
static <K,V> Map<K,List<V>> getMapFromTheListOld_1(List<Map<K,V>> list){
Map<K,List<V>> map = new HashMap<>();
for(Map<K,V> m : list){
for(Map.Entry<K,V> e : m.entrySet()){
if( !map.containsKey(e.getKey())){
map.put(e.getKey(), new ArrayList<>());
}
map.get(e.getKey()).add(e.getValue());
}
}
return map;
}
Sie können die innere Schleife vereinfachen, indem Sie Map#computeIfAbsent
:
static <K,V> Map<K,List<V>> getMapFromTheListOld_2(List<Map<K,V>> list){
Map<K,List<V>> map = new HashMap<>();
for(Map<K,V> m : list){
for(Map.Entry<K,V> e : m.entrySet()){
map.computeIfAbsent(e.getKey(), k -> new ArrayList<>()).add(e.getValue());
}
}
return map;
}
Aber IMO beide Ansätze sind nicht einfacher als Ihr Einzeiler mit Streams. Sie können jedoch einige neue Zeilen hinzufügen, um die Lesbarkeit zu verbessern:
static <K,V> Map<K,List<V>> getMapFromTheList(List<Map<K,V>> list){
return list.stream()
.flatMap(map -> map.entrySet().stream())
.collect(Collectors.groupingBy(
Map.Entry::getKey, Collectors.mapping(Map.Entry::getValue, Collectors.toList())));
}
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen