ich einen Code haben setzen sich wie folgt:Java-Streams Mit dem letzten begegnet Wert in einer Karte
Map<RiskFactor, RiskFactorChannelData> updateMap =
updates.stream().filter(this::updatedValueIsNotNull). // Remove null updated values
collect(Collectors.toMap(
u -> u.getUpdatedValue().getKey(), // then merge into a map of key->value.
Update::getUpdatedValue,
(a, b) -> b)); // If two values have the same key then take the second value
Insbesondere möchte ich die Werte aus der Liste nehmen und sie in die Karte setzen. Das alles funktioniert perfekt. Meine Sorge ist jedoch mit der Bestellung.
Zum Beispiel, wenn die Liste hat:
a1, b1, a2
Wie stelle ich sicher, dass die endgültige Karte enthält:
a->a2
b->b1
Statt
a->a1
b->b1
Die Eingangsliste wird bestellt, stream().filter()
sollte die Bestellung beibehalten haben, aber ich kann nichts in der Dokumentation vonsehenüber die Reihenfolge der Eingänge.
Ist das im allgemeinen Fall sicher oder habe ich gerade Glück auf meinen Testfällen gehabt? Werde ich JVM-abhängig und in Gefahr sein, dass sich das in Zukunft ändert?
Dies ist sehr einfach zu garantieren, wenn ich nur eine for
Schleife schreiben, aber die "Fuzzyness" des potenziellen Stream-Verhalten macht mich besorgt.
Ich plane nicht, dafür parallel zu verwenden, ich versuche nur, das Verhalten im Falle eines sequentiellen nichtparallelen Streams zu verstehen, der toMap
erreicht.
Ich weiß nicht, ob es sicher ist, aber wenn es nicht ist, könnten Sie 'Collectors.groupingBy' vor dem' Collectors.toMap' verwenden – Aaron
Mögliche Duplikate: http://StackOverflow.com/questions/30258566/java- stream-map-and-collect-order-of-resulting-container – assylias
Oder vielleicht besser: http://stackoverflow.com/a/30530572/829571 – assylias