Das forEach
funktioniert gut
var newMarkers = new List<Marker>();
providers.forEach((p) {
var marker = markerFrom(p);
newMarkers.add(marker);
print("got one");
});
_markers = newMarkers;
Dies map
wird jedoch nie aufgerufen, wenn es genau an der gleichen Stelle platziert wird wie forEach
:
_markers = providers.map((p) => markerFrom(p));
Zusätzlich ist dies die markerFrom
Methode:
Marker markerFrom(FoodProvider provider) {
var marker = new Marker(new MarkerOptions()
..map = _map
..position = new LatLng(provider.latitude, provider.longitude)
..title = provider.name
..icon = 'http://maps.google.com/mapfiles/ms/icons/red-dot.png'
);
var infoWindow = new InfoWindow(new InfoWindowOptions()..content = marker.title);
marker.onClick.listen((e) {
infoWindow.open(_map, marker);
});
return marker;
}
Die map
Funktion Iterable
ist faul . Es wird nur ein Wrapper um das Original erstellt Iterable
, aber es wird nichts unternommen, bis Sie mit der Iteration beginnen.
Das ist eine gute Sache , auch wenn es überraschend sein kann, wenn Sie an eine eifrige map
Funktion aus anderen Sprachen gewöhnt sind. Dies bedeutet, dass Sie Operationen an iterablen Elementen wie den folgenden kombinieren können:
listOfStrings
.map((x) => complicatedOperationOnString(x))
.take(2)
.forEach(print);
Dies führt nur die komplizierte Operation an den ersten beiden Zeichenfolgen aus.
Wenn Sie eine Liste des Markers wollen, müssen Sie Anruf toList
nach dem map
:
_markers = providers.map(markerFrom).toList();
Im Allgemeinen sollten Sie sehr vorsichtig sein, wenn die an übergebene Funktion map
Nebenwirkungen hat, die nur einmal auftreten sollen. Wenn Sie das Ergebnis map
mehrmals wiederholen, tritt dieser Effekt jedes Mal auf. Wenn Sie also Folgendes getan haben:
_markers = providers.map(markerFrom);
int count = _markers.length;
_markers.forEach((marker) { doSomething(marker); });
Sie würden riskieren, dass die Nebenwirkungen zweimal auftreten, einmal für length
und einmal für forEach
, die beide iterieren _markers
. Es kommt nicht immer vor (einige Iterables kennen ihre, length
ohne sie tatsächlich zu iterieren), aber es ist immer ein Risiko. Verwenden Sie in diesen Fällen entweder, forEach
wenn der Nebeneffekt das einzige ist, nach dem Sie toList
suchen , oder führen Sie sofort eine Aktion durch , um alle Vorgänge zu erzwingen, und sehen Sie sich danach nur die resultierende Liste an.
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