サーチ…


構文

  • 明示的なパラメータ:

  • {parameterName:ParameterType、otherParameterName:OtherParameterType - > anExpression()}

  • 推論されるパラメータ:

  • 加算:(Int、Int) - > Int = {a、b - > a + b}

  • 単一のパラメータは、 it省略します。

  • val square:(Int) - > Int = {it * it}

  • 署名:

  • () - > ResultType

  • (InputType) - > ResultType

  • (InputType1、InputType2) - > ResultType

備考

入力型のパラメータは、コンテキストから推測できるときに省略することができます。たとえば、関数をとるクラスの関数があるとします。

data class User(val fistName: String, val lastName: String) {
    fun username(userNameGenerator: (String, String) -> String) =
        userNameGenerator(firstName, secondName)
}

ラムダを渡すことによってこの関数を使用することができます。パラメータはすでに関数シグネチャで指定されているため、ラムダ式でパラメータを再宣言する必要はありません。

val user = User("foo", "bar")
println(user.userName { firstName, secondName ->
     "${firstName.toUppercase}"_"${secondName.toUppercase}"
 }) // prints FOO_BAR

これは、ラムダを変数に代入する場合にも適用されます。

//valid:
val addition: (Int, Int) = { a, b -> a + b }
//valid:
val addition = { a: Int, b: Int -> a + b }
//error (type inference failure):
val addition = { a, b -> a + b }

ラムダは、一つのパラメータを取り、型は文脈から推測できる場合は、次の方法でパラメータを参照することができit

listOf(1,2,3).map { it * 2 } // [2,4,6]

関数をフィルタリングするパラメータとしてのLambda

val allowedUsers = users.filter { it.age > MINIMUM_AGE }

ラムダは変数として渡される

val isOfAllowedAge = { user: User -> user.age > MINIMUM_AGE }
val allowedUsers = users.filter(isOfAllowedAge)

関数呼び出しをベンチマークするためのLambda

関数の実行に要する時間を計測する汎用ストップウォッチ:

object Benchmark {
    fun realtime(body: () -> Unit): Duration {
        val start = Instant.now()
        try {
            body()
        } finally {
            val end = Instant.now()
            return Duration.between(start, end)
        }
    }
}

使用法:

val time = Benchmark.realtime({
    // some long-running code goes here ...
})
println("Executed the code in $time")


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow