Ein anderer Weg, dies zu tun ist, um die Werte, die Sie aus der transformierten Map
nicht wollen, zu entfernen:
Map<String, Integer> output = input.entrySet().stream()
.collect(Collectors.toMap(
Map.Entry::getKey,
e -> Integer.parseInt(e.getValue()),
(a, b) -> { throw new AssertionError(); },
HashMap::new
));
output.values().removeIf(v -> v % 2 != 0);
Dies setzt voraus, Sie wollen ein veränderliches Map
als das Ergebnis, wenn nicht, können Sie wahrscheinlich eine unveränderliche erstellen ein von output
.
Wenn Sie die Werte in der gleichen Art transformieren und wollen, dass die Map
an seinem Platz modifizieren diese viel kürzer mit replaceAll
sein könnte:
input.replaceAll((k, v) -> v + " example");
input.values().removeIf(v -> v.length() > 10);
Dies auch input
Wandelbare annimmt.
ich nicht empfehlen dies zu tun, weil es nicht für alle gültigen Map
Implementierungen arbeiten und stoppen können für HashMap
in Zukunft arbeiten, aber Sie derzeit replaceAll
verwenden können und werfen einen HashMap
die Art des ändern Werte:
((Map)input).replaceAll((k, v) -> Integer.parseInt((String)v));
Map<String, Integer> output = (Map)input;
output.values().removeIf(v -> v % 2 != 0);
Dies wird Ihnen auch geben Sie Sicherheitswarnungen geben und wenn Sie versuchen, einen Wert aus dem Map
durch eine Referenz des alten Typs wie folgt abzurufen:
String ex = input.get("a");
Es wird eine ClassCastException
werfen.
Sie den ersten Teil in ein Verfahren verwandeln bewegen könnte die vorformulierten zu vermeiden, wenn Sie erwarten, eine Menge, es zu benutzen:
public static <K, VO, VN, M extends Map<K, VN>> M transformValues(
Map<? extends K, ? extends VO> old,
Function<? super VO, ? extends VN> f,
Supplier<? extends M> mapFactory){
return old.entrySet().stream().collect(Collectors.toMap(
Entry::getKey,
e -> f.apply(e.getValue()),
(a, b) -> { throw new IllegalStateException("Duplicate keys for values " + a + " " + b); },
mapFactory));
}
Und es wie folgt verwenden:
Map<String, Integer> output = transformValues(input, Integer::parseInt, HashMap::new);
output.values().removeIf(v -> v % 2 != 0);
Hinweis dass die doppelte Schlüsselausnahme ausgelöst werden kann, wenn z. B. die old
Map
eine IdentityHashMap
ist und die mapFactory
eineerstellt.
Ich glaube nicht, dass es möglich ist. Basierend auf javadoc "Ein Stream sollte nur einmal ausgeführt werden (durch einen Zwischen- oder Terminal-Stream-Vorgang). Dies schließt zum Beispiel" gegabelte "Streams aus, bei denen dieselbe Quelle zwei oder mehr Pipelines oder mehrere Traversierungen derselben durchführt stream. Eine Stream-Implementierung kann IllegalStateException auslösen, wenn sie erkennt, dass der Stream wiederverwendet wird. " – kosa
@Namban Das ist nicht, worum es in der Frage geht. – immibis