だと思うが実際にはJVM上でコンパイルされているものです:
interface Function<I, O> {
fun inkoke(param: I): O
}
I
O
が出力タイプ(戻り値)の一種で、入力パラメータのタイプです。
Kotlinのすべてのlambdaは、実際には、与えられた数のパラメータと戻り値の型を持つ単一のメソッドinvoke
でオブジェクトを定義する略式の構文です。 これを考慮して高次関数を書き直しましょう。
fun lambdaTest(someMethod: Function<Int, Boolean>) {
// Call invoke with an Int paramater. This returns a Boolean.
val isTheAnswerOfTheUniverse = someMethod.invoke(42)
}
は今、私たちは、このメソッドを呼び出します。
// We can pass an anonymous class as the parameter
lambdaTest(object : Function<Int, Boolean>() {
override fun invoke(param: Int): Boolean {
println("Lambda called with number: $param")
// Prints "Lambda called with number: 42"
return param == 42
}
})
これは(Int) -> Boolean
と同じです。唯一の違いは、構文は次のとおりです。Kotlinは関数型言語でもあるとして、それはので、(省略可能な変数
.invoke
としての機能を定義するため、このような
- として、読みやすさを改善し、定型を減らすために、専用のシンタックスをシンタックスシュガーを提供しています)
- Java 8が(Kotlinの中括弧を使用しているように)ラムダを定義するための専用の構文です。
- ラムダが高次関数の最後のパラメータである場合、ラムダは角括弧の外で表すことができます。ここで
ラムダ構文と同等です:
fun lambdaTest(someMethod: (Int) -> Boolean) {
val isTheAnswerOfTheUniverse = someMethod(42)
}
fun main(args: Array<String>) {
lambdaTest { param ->
println("Lambda called with number: $param")
// Prints "Lambda called with number: 42"
// The result of the last expression is returned
param == 42
}
}
ありがとうございました!あなたの答えは物事をクリアしました。 – sunflower20