Diferencia entre fold() y reduce() en Kotlin

David Mbochi Njonge 30 enero 2023
  1. Método Kotlin fold() en acción
  2. Método Kotlin reduce() en acción
  3. Conclusión
Diferencia entre fold() y reduce() en Kotlin

Los métodos fold() y reduce() son funciones de extensión de la interfaz Iterable. Estos métodos consumen una lista de elementos y los transforman en un solo elemento.

Dado que la interfaz Collection implementa la interfaz Iterable, podemos usar los métodos con cualquier clase o interfaz que sea un subtipo de la clase Collection.

En este tutorial, aprenderemos la diferencia entre los métodos fold() y reduce() entendiendo cómo funcionan y brindando un ejemplo para cada caso.

Método Kotlin fold() en acción

Vaya a IntelliJ y seleccione File > New > Project para crear un nuevo proyecto. Ingrese el nombre del proyecto como kotlinFoldAndReduce, o cualquier nombre que prefiera. Seleccione Kotlin en la sección Idioma e Intellij en la sección Sistema de compilación. Pulse el botón Crear para crear el proyecto.

Una vez creado el proyecto, crea la estructura de carpetas com/fold para el método fold() y com/reduce para el método reduce().

Cree un nuevo archivo llamado Main.kt en la carpeta fold, y copie y pegue el siguiente código en el archivo.

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

El método auxiliar listOf() que creamos en este código devolverá una lista de elementos Producto, y de la lista devuelta, podemos invocar el método fold().

Cuando invocamos el método fold(), debemos proporcionar el valor inicial que se utilizará como acumulador del cálculo. Tenga en cuenta que si la colección devuelta está vacía, el método fold() devuelve el valor inicial que proporcionamos.

Ejecute el código y verifique que genere el precio total de todos los elementos del producto en la lista, como se muestra a continuación.

Producción :

670

El método fold() también se puede utilizar para comprobar valores al menos mayores o menores que el valor inicial. El siguiente ejemplo prueba todos los elementos producto de la lista para devolver el precio del producto al menos superior a 300, por lo que establecemos 300 como el valor inicial de la función fold().

Asegúrese de comentar el ejemplo anterior en el método principal antes de copiar y pegar este ejemplo en el archivo.

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

Ejecute el código para verificar que genera el siguiente valor: el precio máximo de todos los elementos de producto en la lista.

Producción :

320

Método Kotlin reduce() en acción

Cree un archivo Main.kt en la carpeta reduce, y copie y pegue el siguiente código en el archivo.

package com.reduce

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

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

Dado que el método reduce() no tiene un valor inicial, utiliza el primer elemento de la lista como valor inicial. En este ejemplo, el valor 20 es el primer valor del acumulador y el cálculo con 40 devuelve el siguiente valor del acumulador.

Ejecute el código y asegúrese de que genera el siguiente resultado.

Producción :

120

En el ejemplo anterior, hemos aprendido que el valor inicial proporcionado se devuelve en caso de que la lista esté vacía. El método reduce() lanza una UnsupportedOperationException, una RuntimeException, en caso de que la lista esté vacía.

Para evitar que el método reduce() lance RuntimeException, podemos verificar si la lista está vacía antes de realizar cualquier cálculo. El siguiente código devuelve un valor de 0 en caso de que la lista de tipo int esté vacía.

Comente el ejemplo anterior y copie y pegue este ejemplo en el archivo después del comentario.

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

Ejecute el código y observe que el valor registrado en la consola es 0 ya que la lista que creamos está vacía.

Producción :

0

Conclusión

En este tutorial, hemos aprendido a diferenciar entre las funciones de extensión fold() y reduce(). También hemos cubierto cómo los dos métodos manejan situaciones cuando la lista está vacía para evitar las excepciones que podrían generarse.

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