[Kotlin]高次関数とRamda式について


! 3週間のアプリケーション面白さが終わった後、低級アプリケーションを実現しましたが、コードが乱れすぎて可読性も悪く、修正が必要な部分が多かったです.コードを再包装してきれいにするためには、コトリンをさらに理解する必要があると思い、勉強しました.

1.第1クラスの関数


高次関数とRamda式を理解するには1次関数を理解する必要がある.そこで筆者は複数のブログやサイトを調べ,CodeCharというところで詳しく説明し,参考として学習した.codechacha
一級関数とは,オブジェクトとして扱う関数であり,3つの特徴を持つ.

  • 一級関数は、関数のオブジェクトとして使用できます.

  • 一級関数は、関数オブジェクトをパラメータとして渡すことができます.

  • 一級関数は、関数の戻り値であってもよい.
  • この3つの特性をコードで理解しましょう.

    ①一級関数は、関数の対象とすることができる。

    val hi: () -> String = {"hi my friend"}
    上記のコードでは、変数hiに関数を割り当て、「hi myfried」を返します.

    ②一級関数は、関数オブジェクトをパラメータとして渡すことができます。

    val hi: () -> String = {"hi my friend"}
    
    fun printHi(func: () -> String){
    	print("${func()}")
    }
    
    fun main(){
    	printHi(hi)
    }
    ここでprintHiの場合、文字列をパラメータに返す関数を受け取り、実際にStringを返すhiをprintHiのパラメータに渡すと、「hi myfriend」が出力されます.

    ③一級関数は、関数の戻り値とすることができる。

    val hi: () -> String = {"hi my friend"}
    
    fun printHi() : () -> String {
    	return hi
    }
    
    fun main(){
    	val returned : () -> String = printHi()
        print("${returned()}")
    }
    printHi関数の場合、hiという関数が返され、文字列が返されます.この関数を受信し、返される関数オブジェクトを作成して呼び出すと、hi myfriendが出力されます.

    2.高次関数


    上記でまとめた1次関数の特徴を熟知している場合は、高次関数の内容を簡単に理解できます.

    -1次関数は、関数オブジェクトをパラメータとして渡すことができます。


    -一級関数は、関数の戻り値とすることができます。


    1次関数の3つの特徴のうち、上記の2つの特徴のいずれかを満たす場合、高次関数と呼ぶ.
    val hi: () -> String = {"hi my friend"}
    
    fun printHi(func: () -> String) : () -> String {
    	return hi
    }
    
    fun main(){
    	val returned = printHi(hi)
        print("${returned()}")
    }
    上記のコードでは、printHiという名前の関数がパラメータとして受け入れられ、結果として関数が返されます.
    ここで、パラメータとして関数を渡す場合は、()->String、パラメータとして2つの関数を渡す場合は()->Stringなどの関数のタイプを名前の後に明記する必要があります.
    (Int,Int)->String.他に戻り値がない場合は、->の後にUnitで表すことができます.
    高次関数は、コールバックインタフェースを使用する場合と同様に、コンポーネント間の通信に役立ちます.この車でファンデーションを直すときに使ったほうがいい(?)

    3.ランダ式


    「cottlindocument」を参照

    Ramda式は,無名関数を定義するための関数表現である.


    このramda式により匿名クラスと匿名関数を簡潔に表すことができ,非常に有用である.ただし,デバッグが困難でコードを乱発すると,かえってコードの毒性が低下するため,注意して使用する.
    max(strings, {a, b -> a.length < b.length})
    上のコードは高次関数です.関数が2番目のパラメータに渡されるからです.
    ここで、{a,b−>a.lengthfun compare(a: String, b: String) : Boolean { return a.length < b.length }この2つのコードにより、compareという関数をカッコ内のコードに置き換え、名前のない関数として表すことができます.

    ラムダ式文法

    val sum: (Int, Int) -> Int = { x: Int, y: Int -> x + y }

  • ラムダ式はいつも括弧で囲まれている.

  • ->記号の後は関数のbody部分です.

  • ->関数に渡すパラメータを前に入力します.
  • 後続ランダ転送


    コトリンの規則によれば,関数の最後のパラメータが関数である場合,そのパラメータに伝達されるRamda式を括弧の外に置くことができる.上のコード
    max(Strings, {a,b -> a.length < b.length})
    次のように表示できます.
    max(strings) {a,b -> a.length < b.length}
    また、ラムダ式にパラメータがある場合は、パラメータ->パラメータをスキップしてitとマークする必要はありません.
    まずここまで勉強しなさい.