List <V> in Map <K, List <V >>, mit Java 8-Streams und benutzerdefinierte Liste und Karte Lieferanten Wie konvertiert?

MarcG:

Es ist einfach zu konvertieren List<V>in Map<K, List<V>>. Zum Beispiel:

public Map<Integer, List<String>> getMap(List<String> strings) {
   return
      strings.stream()
             .collect(Collectors.groupingBy(String::length));
}

Aber ich will , es zu tun mit meiner eigenen Listund Map Lieferanten .

Ich habe mit diesem kommen:

public Map<Integer, List<String>> getMap(List<String> strings) {
   return strings.stream()
       .collect(Collectors.toMap(
             String::length,
             item -> {List<String> list = new ArrayList<>(); list.add(item); return list;},
             (list1, list2) -> {list1.addAll(list2); return list1;},
             HashMap::new));
}

Frage: Gibt es eine einfachere, weniger ausführlich, oder effizientere Art und Weise , es zu tun? Zum Beispiel so etwas wie dies (was nicht funktioniert):

return strings.stream()
      .collect(Collectors.toMap(
            String::length,
            ArrayList::new,                    
            HashMap::new));

Und was , wenn ich brauche nur das zu definieren , ListLieferanten, aber nicht die MapLieferanten?

Tunaki:

Sie könnten folgende Voraussetzungen erfüllt sein:

public Map<Integer, List<String>> getMap(List<String> strings) {
    return strings.stream().collect(
      Collectors.groupingBy(String::length, HashMap::new, Collectors.toCollection(ArrayList::new))
    );
}

Der Kollektor groupingBy(classifier, mapFactory, downstream)kann verwendet werden , um festzulegen , welche Art von Karte gesucht, indem sie einen Lieferanten , der das wollte Karte für die Durch mapFactory. Dann wird der stromabwärtige Sammler, der verwendet wird , um Elemente mit derselben Taste gruppiert zu sammeln ist toCollection(collectionFactory), die es ermöglicht , in eine Sammlung von bestimmten Lieferanten erhalten zu sammeln.

Dies stellt sicher , dass die zurückgegebene Karte eine ist HashMapund dass die Listen, in jedem Wert ist ArrayList. Beachten Sie, dass , wenn Sie bestimmte Implementierungen von Karte und Sammlung zurückkehren möchten, dann werden Sie wahrscheinlich die Methode wollen auch die spezifischen Typen zurück, so dass Sie ihre Eigenschaften verwenden können.

Wenn Sie nur eine Sammlung Lieferanten angeben möchten, und halten Sie groupingByStandard - Karte, können Sie weglassen nur den Lieferanten in dem obigen Code und verwenden die beiden Argumente überlasten :

public Map<Integer, List<String>> getMap(List<String> strings) {
    return strings.stream().collect(
      Collectors.groupingBy(String::length, Collectors.toCollection(ArrayList::new))
    );
}

Als Randbemerkung, könnten Sie eine generische Methode dafür haben:

public <K, V, C extends Collection<V>, M extends Map<K, C>> M getMap(List<V> list,
        Function<? super V, ? extends K> classifier, Supplier<M> mapSupplier, Supplier<C> collectionSupplier) {
    return list.stream().collect(
        Collectors.groupingBy(classifier, mapSupplier, Collectors.toCollection(collectionSupplier))
    );
}

Der Vorteil dieser Erklärung ist , dass Sie nun spezifisch haben können HashMapvon ArrayLists als Ergebnis oder LinkedHashMapvon LinkedListss, wenn der Anrufer wünscht es:

HashMap<Integer, ArrayList<String>> m = getMap(Arrays.asList("foo", "bar", "toto"),
        String::length, HashMap::new, ArrayList::new);
LinkedHashMap<Integer, LinkedList<String>> m2 = getMap(Arrays.asList("foo", "bar", "toto"),
        String::length, LinkedHashMap::new, LinkedList::new);

aber an diesem Punkt kann es einfacher sein , direkt das zu verwenden , groupingByin dem Code ...

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.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

Java 8 convert Map <K, List <V >> zur Karte <V, List <K >>

Wie Objekte aus der Liste mit den Daten aus der Karte mit Zustand und speichern auf eine andere Karte mit Java 8 Streams entsprechen

Java 8-Streams: Lassen Sie Collectors.groupingBy Map <K, List <V >> anstelle von Map <K, List <List <V >> zurückgeben

Erstellen Sie eine Karte von Streich- und sortierte Liste mit Java 8 Streams API

So verwandeln Sie List <T> mit Lambda in JAVA8 in List <Map <K, V >>

Wie konvertiert man eine Liste in eine Map mit Java-8-Streams, wobei der Schlüssel der ListValue und der Wert die Anzahl der Werte dieser bestimmten Liste ist?

Wie man groupBy Objekteigenschaften und Karte auf ein anderes Objekt mit Hilfe von Java 8 Streams?

Wie erstelle ich eine Liste <T> aus Map <K, V> und Liste <K> von Schlüsseln?

Wie könnte eine Liste in Map <K, V>, aber nicht in List <V> umgewandelt werden?

Wie mehrere Liste mit flacher Karte mit null und leeren Check-in Java 8 fusionieren?

Wie ich Liste tun, Karte und "print wenn count> 0" mit Java 8 / Stream API?

Wie Explicit Karte mit Java 8 und ModelMapper benutzen?

Konvertieren Sie List<String> in Map<String, List<String>> mit Listenwert als Map-Schlüssel und Map-Wert mit leerer Liste java 8

Karte <K, V> zurück zur Karte <V, Map <K, V >> nach groupingBy Wert, statt Map <Obj, List <Eintrag <K, V >>>

TypeError: 'str'- und 'list'-Objekte können nicht verkettet werden. Wie konvertiert man eine Liste in eine Zeichenfolge?

Wie konvertiert man eine Liste mit Java8 in eine Karte?

Wie konvertiere ich mit Java 8-Streams Map <String, List <Something>> in Map <String, Integer>?

Gruppieren einer Liste von Elementen mit Java 8-Streams und Auffüllen der resultierenden Karte mit dem ERSTEN Element anstelle der Liste

Wie konvertiert man eine JSON-Map mit Gson in eine benutzerdefinierte Java-Liste?

Wie transformiere ich in Java 8 eine Map <K, V> mit einem Lambda in eine andere Map <K, V>?

Wie vergleichen zwei Arraylist und get list1 mit Filter mit Java-Streams

Wie kann man List to Map<T, <K, List<Person>>> umwandeln und Java-Lambda verwenden?

Java 8-Funktion, die eine Liste <V> verwendet und eine HashMap <K, Liste <V>> zurückgibt

Extrahierung der Karte <K, Multiset <V >> von Strom von Streams in Java 8

Konvertieren von List <MyObject> in Map <String, List <String>> in Java 8, wenn doppelte Elemente und benutzerdefinierte Filterkriterien vorhanden sind

So konvertieren Sie List <Map <K, V >> in Map <K, List <V >> in Java

Invert Karte mit Listenwert Map <Key, List <Wert >> zur Karte <Wert, Key> in Java 8

Wie eine List <Karte>, Gruppe von Map-Tasten und reduzieren durch Map Werte auszupacken

Java 8 Iterate List innerhalb einer Liste und stream.map()