Différence entre fold() et reduce() dans Kotlin

David Mbochi Njonge 30 janvier 2023
  1. Méthode Kotlin fold() en action
  2. Méthode Kotlin reduce() en action
  3. Conclusion
Différence entre fold() et reduce() dans Kotlin

Les méthodes fold() et reduce() sont des fonctions d’extension de l’interface Iterable. Ces méthodes consomment une liste d’éléments et les transforment en un seul élément.

Étant donné que l’interface Collection implémente l’interface Iterable, nous pouvons utiliser les méthodes avec n’importe quelle classe ou interface qui est un sous-type de la classe Collection.

Dans ce tutoriel, nous allons apprendre la différence entre les méthodes fold() et reduce() en comprenant leur fonctionnement et en fournissant un exemple pour chaque cas.

Méthode Kotlin fold() en action

Allez dans IntelliJ et sélectionnez File > New > Project pour créer un nouveau projet. Entrez le nom du projet comme kotlinFoldAndReduce, ou n’importe quel nom préféré. Sélectionnez Kotlin dans la section Langue et Intellij dans la section Build System. Appuyez sur le bouton Créer pour créer le projet.

Une fois le projet créé, créez la structure de dossiers com/fold pour la méthode fold() et com/reduce pour la méthode reduce().

Créez un nouveau fichier nommé Main.kt sous le dossier fold, puis copiez et collez le code suivant dans le fichier.

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()
    });
}

La méthode d’assistance listOf() que nous avons créée dans ce code renverra une liste d’éléments Product, et à partir de la liste renvoyée, nous pouvons invoquer la méthode fold().

Lorsque nous invoquons la méthode fold(), nous devons fournir la valeur initiale qui servira d’accumulateur du calcul. Notez que si la collection renvoyée est vide, la méthode fold() renvoie la valeur initiale que nous avons fournie.

Exécutez le code et vérifiez qu’il affiche le prix total de tous les éléments de produit de la liste, comme indiqué ci-dessous.

Production:

670

La méthode fold() peut également être utilisée pour vérifier les valeurs au moins supérieures ou inférieures à la valeur initiale. L’exemple suivant teste tous les éléments product de la liste pour renvoyer le prix product au moins supérieur à 300, nous définissons donc 300 comme valeur initiale de la fonction fold().

Assurez-vous de commenter l’exemple précédent dans la méthode principale avant de copier et coller cet exemple dans le fichier.

fun main() {
    println(products.fold(300) { expensiveProduct, product ->
        if (product.getPrice() > expensiveProduct)
            product.getPrice() else expensiveProduct
    });
}

Exécutez le code pour vérifier qu’il renvoie la valeur suivante : le prix maximum de tous les éléments product de la liste.

Production:

320

Méthode Kotlin reduce() en action

Créez un fichier Main.kt dans le dossier reduce, puis copiez et collez le code suivant dans le fichier.

package com.reduce

val list: List<Int> = listOf(20,40,60)

fun main() {
    println(list.reduce { sum, value ->
        sum + value
    });
}

Comme la méthode reduce() n’a pas de valeur initiale, elle utilise le premier élément de la liste comme valeur initiale. Dans cet exemple, la valeur 20 est la première valeur d’accumulateur, et le calcul avec 40 renvoie la valeur d’accumulateur suivante.

Exécutez le code et assurez-vous qu’il génère le résultat suivant.

Production:

120

Dans l’exemple précédent, nous avons appris que la valeur initiale fournie est renvoyée si la liste est vide. La méthode reduce() lève une UnsupportedOperationException, une RuntimeException, dans le cas où la liste est vide.

Pour empêcher la méthode reduce() de lever RuntimeException, nous pouvons vérifier si la liste est vide avant de faire tout calcul. Le code suivant renvoie une valeur de 0 dans le cas où le type liste int est vide.

Commentez l’exemple précédent, puis copiez et collez cet exemple dans le fichier après le commentaire.

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);
}

Exécutez le code et notez que la valeur enregistrée dans la console est 0 puisque la liste que nous avons créée est vide.

Production:

0

Conclusion

Dans ce tutoriel, nous avons appris à différencier les fonctions d’extension fold() et reduce(). Nous avons également expliqué comment les deux méthodes traitent les situations où la liste est vide pour éviter les exceptions qui pourraient être levées.

David Mbochi Njonge avatar David Mbochi Njonge avatar

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