Verketten von Map, Filter und Reduce
Teil des Abschnitts Logik & Kontrollfluss der Swift-Journey von Coddy. Lektion 26 von 56.
Die eigentliche Stärke dieser drei Methoden liegt darin, dass sie sich kombinieren lassen. Jeder Schritt transformiert die Daten und übergibt sie an den nächsten.
let nums = [1, 2, 3, 4, 5, 6]
let result = nums
.filter { $0 % 2 == 0 } // [2, 4, 6]
.map { $0 * $0 } // [4, 16, 36]
.reduce(0, +) // 56
print(result) // 56Von oben nach unten gelesen: Behalte die geraden Zahlen, quadriere sie und summiere die Quadrate. Jeder Schritt ist eine offensichtliche Sache, und die Kette bleibt lesbar, selbst wenn sie wächst.
Diese Pipeline-Form ersetzt eine handgeschriebene Schleife durch eine ausdrückliche Absicht. filter bedeutet „auswählen“. map bedeutet „transformieren“. reduce bedeutet „zusammenfassen“.
Leser können die Kette überfliegen und sehen, was passiert, ohne Indexvariablen nachzuverfolgen.
Eine schnelle Regel: Die Reihenfolge ist wichtig. Das Filtern vor dem Zuordnen verursacht weniger Arbeit als das Zuordnen vor dem Filtern, wenn der Filter selektiv ist.
Aufgabe
MittelLies eine einzelne Eingabezeile ein: eine durch Kommas getrennte Liste von price:quantity-Paaren. Zum Beispiel bedeutet 3:2,5:1,2:4,7:0 vier Bestellungen.
Für jede Bestellung mit quantity > 0 ist die Zeilensumme price * quantity. Gib drei Zeilen aus:
- Die Zeilensummen (nur für Bestellungen mit
quantity > 0), verbunden durch, - Die Gesamtsumme dieser Zeilensummen
- Die Anzahl der Bestellungen, die beigetragen haben (d. h. deren Menge größer als null ist)
Erstelle die Pipeline mit filter gefolgt von map und leite dann die Anzahl und die Summe aus dem Ergebnis ab.
Für die Eingabe 3:2,5:1,2:4,7:0 lautet die Ausgabe:
6,5,8
19
3Probier es selbst
let orders = readLine()!.components(separatedBy: ",").map { pair -> (Int, Int) in
let parts = pair.components(separatedBy: ":")
return (Int(parts[0])!, Int(parts[1])!)
}
// TODO: quantity > 0 filtern, auf Zeilensummen mappen; joined, Summe, Anzahl ausgeben
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Kontrollfluss
1Strings im Detail
Zählen und IndizesGroß-/Kleinschreibung und TrimSuchen in StringsAufteilen und ZusammenfügenTeilstrings ersetzenRückblick – Benutzernamen prüfen4Mengen
Mengen erstellenVereinigung und SchnittmengeSubtraktion und symmetrische DifferenzTeilmenge und ObermengeWiederholung – Tag-Filter7Projekt – Gewohnheitstracker
ProjektübersichtAls erledigt markieren2Bereiche & Schrittweiten
Geschlossen vs. halboffenSchrittweiteBereichsmethodenBereiche in SwitchRückblick – Kalender-Raster5Funktionen höherer Ordnung Teil 1
MapFilterReduceVerketten von Map, Filter und ReduceRückblick – WortstatistikÜbe selbstständig: Swift-Playground