2016-10-18 1 views
1

Ich habe eine Map<String, String>, die ich in eine Map<Type1,Type2> mit Java-Streams transformieren möchte. DieseWie transformiert man den Schlüssel und den Wert eines jeden Eintragssatzes einer Map mit Java 8?

ist, was ich versucht, aber ich glaube, ich bin die Syntax falsch bekommen:

myMap.entrySet() 
.stream() 
.collect(Collectors.toMap(e -> Type1::new Type1(e.getKey()), e -> Type2::new Type2(e.getValue)))); 

versuchte auch

myMap.entrySet() 
    .stream() 
    .collect(Collectors.toMap(new Type1(Map.Entry::getKey), new Type2(Map.Entry::getValue)); 

Aber ich einfach Fehler laufen kompilieren. Wie mache ich diese Transformation?

+0

Ist es notwendig, Streams zu verwenden? Oft ist es am einfachsten, mit dem einfachen Code zu beginnen und dann Streams zu verwenden, wenn Sie es vereinfachen möchten. Für Ihre Aufgabe würden Sie map() nach stream() aufrufen. Streams und Lambda-Funktionen sind ein Problem, weil die Eingabe für den Benutzer vage ist. Das ist meine Warnung. Viel Glück. Und ein Hinweis, der in die richtige Richtung ist ... https://www.mkyong.com/java8/java-8-filter-a-map-examples/ – ldmtwo

+1

Ihre Syntax für 'collect' und' Collectors.toMap' ist richtig. Ich habe versucht, den gleichen Code mit diesem sammeln: 'Map x = map.entrySet(). Stream(). Sammeln (Collectors.toMap (e -> Integer.parseInt (e.getKey()), e - > Integer.parseInt (e.getValue()))); '. Es klappt. –

Antwort

7

Es sieht aus wie wollen, was Sie wirklich

myMap.entrySet() 
    .stream() 
    .collect(Collectors.toMap(
     e -> new Type1(e.getKey()), e -> new Type2(e.getValue()))); 

ist, obwohl ich es ehrlich gesagt schwer zu sagen, zugeben.

0
myMap.entrySet().stream() 
    .map(entry -> new AbstractMap.SimpleEntry(new Type1(entry.getKey()), new Type2(entry.getValue())) 
    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)) 

https://docs.oracle.com/javase/7/docs/api/java/util/AbstractMap.SimpleEntry.html

Oder eleganter:

myMap.entrySet().stream() 
    .map(this::getEntry) 
    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); 

private Map.Entry<Type1, Type2> getEntry(Map.Entry<String, String> entry) { 
    return new AbstractMap.SimpleEntry(new Type1(entry.getKey()), new Type2(entry.getValue()); 
} 
+3

Seit wann gibt es einen no-arg 'toMap'-Kollektor? –

+0

Es gibt. Wenn ich eine Logik mit Daten machen und sie dann zur Karte sammeln muss, ziehe ich es vor, sie zuerst zuzuordnen und dann zu sammeln. – Zildyan

+0

Vielleicht ergibt sich das Problem aus dem Blick in die Java 7 API beim Umgang mit Java 8 spezifischen Code. Dort finden Sie nicht einmal 'Sammler'. Wenn Sie den Java 8-API-Verweis verwenden, werden Sie feststellen, dass [Collectors.toMap() 'collector] nicht vorhanden ist (https://docs.oracle.com/javase/8/docs/api/?java/util/). stream/Collectors.html) ... – Holger

Verwandte Themen