Menu
Coddy logo textTech

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)                    // 56

Von 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.

challenge icon

Aufgabe

Mittel

Lies 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:

  1. Die Zeilensummen (nur für Bestellungen mit quantity > 0), verbunden durch ,
  2. Die Gesamtsumme dieser Zeilensummen
  3. 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
3

Probier 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
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Logik & Kontrollfluss

Übe selbstständig: Swift-Playground