Kotlin Lambda Function

Lambda is a function which has no name. It is a concise way to define a block of code that can be passed around as an argument to higher-order functions or stored in a variable for later use.

Lambda functions are useful in various contexts, such as higher-order functions, collections operations (like map, filter, and reduce), and asynchronous programming.

The general syntax for a lambda function in Kotlin is as follows:

val lambdaName: (parameter1Type, parameter2Type, ...) -> ReturnType = { parameter1, parameter2, ... ->
    // Function body
    // Return value (if applicable)
}

1. lambdaName: This is an optional name for the lambda function, which can be used if need to reference the function elsewhere.

2. (parameter1Type, parameter2Type, …): These are the parameter types that the lambda function takes. Lambda functions can have zero or more parameters.

3. ReturnType: This is the type of the value that the lambda function will return. you can use Unit If the function doesn’t return anything.

4. ->: This is the lambda operator, which separates the parameter list from the function body.

5. Function body : This is the code that makes up the body of the lambda function. It gets executed when the lambda is called.

Now, let’s see some examples of lambda functions:

Example 1: A lambda function with parameters that adds two numbers and returns the result:

val addNumbers: (Int, Int) -> Int = { a, b -> a + b }

val result = addNumbers(5, 3)
println("Result: $result")  // Output: Result: 8

Example 2: A simple lambda without parameters:

val greet: () -> Unit = {
    println("Hello, World!")
}
// Calling the lambda function 
greet() // Output: Hello, World!

Example 3: Lambda as an argument to a higher-order function:

// Higher-order function to perform a mathematical operation on two numbers
fun calculate(a: Int, b: Int, operation: (Int, Int) -> Int): Int {
    return operation(a, b)
}

fun main() {
    // Using the 'calculate' function with different operations using lambdas
    val addResult = calculate(6, 8) { x, y -> x + y }
    println("Addition Result: $addResult") // Output: Addition Result: 14

    val subtractResult = calculate(10, 7) { x, y -> x - y }
    println("Subtraction Result: $subtractResult") // Output: Subtraction Result: 3

    val multiplyResult = calculate(14, 6) { x, y -> x * y }
    println("Multiplication Result: $multiplyResult") // Output: Multiplication Result: 84
}

In this example, calculate is  a higher-order function that takes two integers a and b, and a lambda operation that takes two integers and returns an integer. The calculate function applies the lambda operation to the input integers a and b and returns the result.

Example 4: return a lambda function from another function

This feature allows you to create functions that generate and customize behavior on-the-fly based on certain conditions or inputs.

Here’s an example:

// Function that returns a lambda
fun createAdder(amount: Int): (Int) -> Int {
    return { x -> x + amount }
}

fun main() {
    // Create an adder function that adds 6 to any input
    val addSix = createAdder(6)

    // Use the returned lambda to perform addition
    val result1 = addSix (10) // 10 + 6 = 16
    val result2 = addSix (20) // 20 + 6 = 26

    println("Result 1: $result1") // Output: Result 1: 16
    println("Result 2: $result2") // Output: Result 2: 26
}

In the main function, we call createAdder(6) to get the addFive lambda. then use addFive to perform addition on different input values (10 and 20 in this case) As a result, we get 16 and 26, respectively, because the addFive lambda adds 6 to the given input..