2017-12-27 25 views
1

私はjava/kotlinの関数型プログラミングの初心者であり、何らかの練習をしています。 呼び出すときにラムダのパラメータをどのように渡すことができますか。例えば、someMethodを呼び出すには、Intパラメータを渡す必要があります。高次関数のパラメータ/ lambdaを呼び出す

fun lambdaTest(someMethod: (Int) -> Boolean){ 
    someMethod() 
} 

どのようにすることができますか?

あなたが取る関数を渡す必要がある。ここ
fun <T, R> List<T>.map(transform: (T) -> R): List<R> { 
    val result = arrayListOf<R>() 
    for (item in this) 
     result.add(transform(item)) 
    return result 
} 

答えて

1

:答えは非常に簡単である、私はちょうどそれがどこでも、ドキュメントにリストを持つ唯一の例では、答えは明らかとなっている場合には、そこにいた見つけることができませんでした引数としてIntをとり、Booleanを返します。

lambdaTest { int -> 
    int > 0 // can be also changed to it 
} 

ここでのIntパラメータが0以上

ある場合は、複数のパラメータをしたい場合は、我々がtrueを返す:

fun lambdaTest(someMethod: (Int, String) -> Unit){ // Unit means do not return anything 
    someMethod(1, "Kotlin") 
} 

そして、それを呼び出す:(Int) -> Boolean

lambdaTest { int, string -> 
    println("Passed Int: $int, and String: $string as parameter") 
    // Output = Passed Int: 1, and String: Kotlin as parameter 
} 
+0

ありがとうございました!あなたの答えは物事をクリアしました。 – sunflower20

1

だと思うが実際にはJVM上でコンパイルされているものです:

interface Function<I, O> { 
    fun inkoke(param: I): O 
} 

IOが出力タイプ(戻り値)の一種で、入力パラメータのタイプです。

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 
        } 
    } 
    
  • +0

    タイプが間違っているようです。あなたはlambdaTestを(Int) - > Booleanという型の関数を期待するものとして定義しますが、それから型の中の引数(Somehing) - > Unitを使ってmainで呼び出します。何か(あなたのparam)はIntとして解釈できるので、あなたの引数は(Int) - > Unitと一致しますが、あなたのprintln()はブール値(Unitとしてのみ)として解釈できません。 – Ekeko

    +0

    あなたは完全に正しいです!フィードバックいただきありがとうございます。 –

    関連する問題