Unterschied zwischen fold() und reduce() in Kotlin
Die Methoden fold()
und reduce()
sind Erweiterungsfunktionen der Schnittstelle Iterable. Diese Methoden verwenden eine Liste von Elementen und wandeln sie in ein einzelnes Element um.
Da die Collection-Schnittstelle die Iterable-Schnittstelle implementiert, können wir die Methoden mit jeder Klasse oder Schnittstelle verwenden, die ein Untertyp der Collection-Klasse ist.
In diesem Tutorial lernen wir den Unterschied zwischen den Methoden fold()
und reduce()
kennen, indem wir verstehen, wie sie funktionieren, und für jeden Fall ein Beispiel geben.
Kotlin fold()
-Methode in Aktion
Gehen Sie zu IntelliJ und wählen Sie Datei > Neu > Projekt
, um ein neues Projekt zu erstellen. Geben Sie den Projektnamen als kotlinFoldAndReduce
oder einen anderen bevorzugten Namen ein. Wählen Sie Kotlin im Abschnitt Sprache und Intellij im Abschnitt Build-System aus. Klicken Sie auf die Schaltfläche Erstellen, um das Projekt zu erstellen.
Sobald das Projekt erstellt ist, erstellen Sie die Ordnerstruktur com/fold
für die fold()
-Methode und com/reduce
für die reduce()
-Methode.
Erstellen Sie eine neue Datei mit dem Namen Main.kt
im Ordner fold
und kopieren Sie den folgenden Code und fügen Sie ihn in die Datei ein.
package com.fold
class Product(private val name: String,
private val price: Int){
fun getName(): String{
return this.name;
}
fun getPrice(): Int{
return this.price
}
}
val products: List<Product> = listOf(
Product("Hp laptop",200),
Product("Java book",320),
Product("Iphone 13",150)
)
fun main() {
println(products.fold(0) { total, employee ->
total+employee.getPrice()
});
}
Die Hilfsmethode listOf()
, die wir in diesem Code erstellt haben, gibt eine Liste von Product
-Elementen zurück, und aus der zurückgegebenen Liste können wir die Methode fold()
aufrufen.
Wenn wir die fold()
-Methode aufrufen, müssen wir den Anfangswert angeben, der als Akkumulator der Berechnung verwendet wird. Beachten Sie, dass die Methode fold()
den von uns bereitgestellten Anfangswert zurückgibt, wenn die zurückgegebene Sammlung leer ist.
Führen Sie den Code aus und vergewissern Sie sich, dass er den Gesamtpreis aller Produktelemente in der Liste ausgibt, wie unten gezeigt.
Ausgabe:
670
Die Methode fold()
kann auch verwendet werden, um zu prüfen, ob Werte mindestens größer oder kleiner als der Anfangswert sind. Das folgende Beispiel testet alle product
-Elemente in der Liste, um den product
-Preis mindestens über 300 zurückzugeben, also setzen wir 300
als Anfangswert der fold()
-Funktion.
Stellen Sie sicher, dass Sie das vorherige Beispiel in der Hauptmethode auskommentieren, bevor Sie dieses Beispiel kopieren und in die Datei einfügen.
fun main() {
println(products.fold(300) { expensiveProduct, product ->
if (product.getPrice() > expensiveProduct)
product.getPrice() else expensiveProduct
});
}
Führen Sie den Code aus, um zu überprüfen, ob er den folgenden Wert ausgibt: den Höchstpreis aller product
-Elemente in der Liste.
Ausgabe:
320
Kotlin reduce()
-Methode in Aktion
Erstellen Sie eine Main.kt
-Datei im Ordner reduce
und kopieren Sie den folgenden Code und fügen Sie ihn in die Datei ein.
package com.reduce
val list: List<Int> = listOf(20,40,60)
fun main() {
println(list.reduce { sum, value ->
sum + value
});
}
Da die Methode reduce()
keinen Anfangswert hat, verwendet sie das erste Element der Liste als Anfangswert. In diesem Beispiel ist der Wert 20
der erste Akkumulatorwert und die Berechnung mit 40
liefert den nächsten Akkumulatorwert.
Führen Sie den Code aus und stellen Sie sicher, dass er das folgende Ergebnis ausgibt.
Ausgabe:
120
Im vorherigen Beispiel haben wir gelernt, dass der bereitgestellte Anfangswert zurückgegeben wird, falls die Liste leer ist. Die Methode reduce()
wirft eine UnsupportedOperationException
, eine RuntimeException
, falls die Liste leer ist.
Um zu verhindern, dass die reduce()
-Methode RuntimeException
auslöst, können wir prüfen, ob die Liste leer ist, bevor wir eine Berechnung durchführen. Der folgende Code gibt den Wert 0
zurück, falls die Liste vom Typ int leer ist.
Kommentieren Sie das vorherige Beispiel, kopieren Sie dieses Beispiel und fügen Sie es nach dem Kommentar in die Datei ein.
package com.reduce
val list: List<Int> = listOf()
fun main() {
val data = if (list.isEmpty()) 0
else list.reduce { sum, value ->
sum + value
}
println(data);
}
Führen Sie den Code aus und beachten Sie, dass der in der Konsole protokollierte Wert 0
ist, da die von uns erstellte Liste leer ist.
Ausgabe:
0
Fazit
In diesem Tutorial haben wir gelernt, wie man zwischen den Erweiterungsfunktionen fold()
und reduce()
unterscheidet. Wir haben auch behandelt, wie die beiden Methoden mit Situationen umgehen, in denen die Liste leer ist, um Ausnahmen zu vermeiden, die möglicherweise ausgelöst werden.
David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.
LinkedIn GitHub