عبارات لامبدا

عبارت لامبدا در اصل یک تابع بی نام است. همانطور که در درس‌های قبل یاد گرفته‌اید، برای تعریف یک متد، به صورت زیر عمل می‌کنیم:

fun showMessage()          
{                          
    println("Hello World!")
}                          

fun main(args: Array<String>)
{
    showMessage()
}
Hello World!

در مثال بالا یک متد به نام ()showMessage ایجاد کرده و در داخل بدنه آن دستورات لازم را نوشته و سپس در خطوط بعدی با صدا زدن آن، کدهای تابع اجرا می‌شوند. حال همین مثال بالا را اگر بخواهیم با عبارات لامبدا پیاده سازی کنیم، باید به صورت زیر عمل کنیم:

fun main(args: Array<String>)
{
    val showMessage = { println("Hello World!") }

    showMessage()
}
Hello World!

این توابع، فوراً و بدون اینکه تعریف شوند، به عنوان یک عبارت نوشته می‌شوند. مثلاً در کد بالا، یک متد بی نام را در متغیری به نام showMessage قرار داده‌ایم. برای فراخوانی توابع بی نام هم کافیست نام متغیر را نوشته و بعد از آن علامت پرانتز بگذاریم. عبارت لامبدا می‌تواند پارامتر هم بگیرد. کد بالا را به صورت زیر اصلاح می‌کنیم:

fun main(args: Array<String>)
{
    val showMessage = { message: String -> println(message) }

    showMessage("Hello World!")
}
Hello World!

در کد بالا گفته‌ایم که عبارت لامبدا یک پارامتر از نوع رشته دارد. هنگام فراخوانی تابع بی نام باید تعداد آرگومان‌ها با تعداد پارامترها برابر باشد. مثلاً کد زیر خطا ایجاد می‌کند:

fun main(args: Array<String>)
{
    val showMessage = { message1: String, message2: String -> println(message1 + message2) }

    showMessage("Hello World!")
}

دلیل خطا هم مشخص است و آن این است که هنگام فراخوانی تابع یک آرگومان به آن اختصاص داده‌ایم در حالیکه باید دو آرگومان اختصاص داده شود. عبارات لامبدا نمی‌توانند دارای کلمه return باشند. می‌توان گفت که دستورات لامبدا در حالت عادی برگردانده می‌شوند و نیازی به این کلمه نیست:

fun main(args: Array<String>)
{
    var getSquare = {number: Int -> number * number}

    print(getSquare(5))
}
25