Kotlinプログラミングの高次関数,Lambda式,匿名関数


Kotlinプログラミングに関する知識点の紹介:
  • KotlinプログラミングIntellij IEDの使用とソースファイル(.kt)
  • の理解
  • Kotlinプログラミングなどの紹介と
  • の使用
  • Kotlinプログラミングなどのプロパティ
  • Kotlinプログラミングの方法
  • Kotlinプログラミングの親と継承親
  • Kotlinプログラミングインターフェースと実装インターフェース
  • Kotlinプログラミングの伴生オブジェクト、抽象クラス、密封クラス
  • Kotlinプログラミングのネストクラス、内部クラス、匿名内部クラス
  • Kotlinプログラミングオブジェクトの式と宣言
  • Kotlinプログラミングの拡張方法
  • Kotlinプログラミングの拡張属性と拡張伴生オブジェクト
  • Kotlinプログラミングの汎用
  • Kotlinプログラミングif文、whileループ、when式、forループ
  • Kotlinプログラミングの可視性修飾語(private,protected,internal,public)
  • Kotlinプログラミングのプロキシモード
  • 高次関数
    A higher-order function is a function that takes functions as parameters, or returns a function
    高次関数には、次のような特徴があります.
  • パラメータ
  • として関数を受け入れる
  • または関数
  • を返す
    リストに関数を拡張し、高次関数の使用法を使用して、コードを次のように記述します.
    package com.xingen.kotlin.day201761
    
    fun main(args: Array) {
    
        var oldlist = arrayListOf(1, 2, 3)
        println("      $oldlist")
    
        /**
         *      :  Java8 lambda   ,        。
         *  lambda      : {     ->     }
         *     item   ,   item+3    
         *
         *     :List.transform()      ,
         *     Kotlin              ,   lambda         ,         ,
         *    ,    List.transform{ lambda    }
         */
    
        var newList = oldlist.transform { item -> item + 3 }
        println("         $newList")
    }
    
    /**
     *  List          transform() ,
     *         ,           
     */
    fun  List.transform(transformFun: (T) -> R): List {
        //      List  ,        item
        var result = arrayListOf()
        /**
         *   java   for  。
         *       this       ,             
         */
        for (item in this) {
            var newItem = transformFun(item)//                 item.
            result.add(newItem)
        }
        return result
    }

    出力結果:
          [1, 2, 3]
             [4, 5, 6]

    わかります.
  • lambda式の形式:{ -> }
  • しかし、Kotlinプログラミングではメソッドの最後のパラメータが関数であり、lambda式をパラメータとして入力し、メソッドのカッコを省略することができる.例えば、上記のコード:List.transform{ lambda }
  • Lambda式
    Lambda式は、宣言されていない関数である字面関数であり、式として渡されます.
     oldlist.transform { item -> item + 3 }

    上のLambda式は、実際には字面関数であり、以下の関数に等しい.
    fun <T> transformFun(item: T):T{
        return item+3
    }

    関数のタイプ:
    パラメータとして関数を受信し、パラメータに関数タイプを指定します.例:
    fun  List.transform(transformFun: (T) -> R): List {
        //      List  ,        item
        var result = arrayListOf()
        /**
         *   java   for  。
         *       this       ,             
         */
        for (item in this) {
            var newItem = transformFun(item)//                 item.
            result.add(newItem)
        }
        return result
    }

    パラメータtransformFunのタイプは(T) -> Rで、関数タイプの意味を解読します.パラメータを渡し、同じタイプの戻り値を返します.transformFunパラメータは関数であるため、1つの関数として使用され、Tタイプのパラメータが渡され、同じタイプの戻り値が返されます.
    Lambda式構文:
    1つ目の構文:
    /**
     *      Lambda   
     */
    var total1={x:Int,y:Int->x+y}

    2つ目は、オプションの寸法を含む構文です.
    /**
     *        Lambda   ,           
     * 
     * var total2:(Int,Int)->Int=...      ,                     ,       。
     */
    var total2:(Int,Int)->Int={  x,y   ->   x+y   }

    Main関数で呼び出すには、次の手順に従います.
    package com.xingen.kotlin.day201761
    
    fun main(args: Array) {
    
        println(  total1(1,2)  )
        println(total2(1,2))
    }

    出力結果は次のとおりです.
    3
    3

    わかります.
  • lambda式は常にカッコで囲まれており、完全な構文形式のパラメータ宣言はカッコ内に配置され、関数体が1つの->記号の後に続くオプションのタイプの寸法があります.
  • 推定されたlambdaの戻りタイプがUnitでない場合、lambda本体の最後の(または単一の)式は、戻り値
  • とみなされる.
    匿名関数
    ほとんどの場合、Lambda式は関数の戻りタイプを指定しません.自動的に推定できるからです.関数の戻りタイプを明示的に指定する必要がある場合は、: に使用する必要があります.
    匿名関数の作成例:
    package com.xingen.kotlin.day201761
    
    fun main(args: Array) {
    
        println(test3(1,2))
        println(test4(1,2))
        println(test5(1,2))
    }
    
    /**
     *     ,    ,           
     *
     *         ,            
     */
    var test3= fun(x:Int,y:Int):Int=x+y
    /**
     *         ,            
     */
    var test4= fun(x:Int,y:Int):Int{
        return  x+y
    }
    /**
     *         ,           ,    
     */
    var test5= fun(x:Int,y:Int)=x+y

    出力結果は次のとおりです.
    3
    3
    3

    わかります.
  • 匿名関数、名前なし、その他の構文は通常の関数と類似しており、例えば、戻り値タイプが推定できる場合、
  • を省略することができる.
    前述の明示的に指定された関数の戻りタイプの違いに加えて、Lambda式と匿名関数の別の違いがあります.
    ラベルなしのreturn文は、funキーで宣言された関数で常に返されます.これは、lambda式のreturnがそれを含む関数から返され、匿名関数のreturnが匿名関数自体から返されることを意味します.
    クローズドパッケージ
    閉パッケージとは、外部の役割ドメインで宣言された変数です.Javaとは異なり、Kotlinプログラミングでは、閉パッケージで取得された変数を変更できます.
    クローズドパッケージにアクセスできる:
  • Lambda式
  • 匿名関数
  • ローカル関数(関数内に含まれる関数)
  • オブジェクト式
  • 例:
    package com.xingen.kotlin.day201761
    
    fun main(args: Array) {
    
        println(i)
        test4(1,2)
        println(1)
    }
    var i=0
    /**
     *         ,            
     */
    var test4= fun(x:Int,y:Int):Int{
        i++ //     ,   
        return  x+y
    }

    出力結果:
    0
    1

    受信者付き文字関数
    Kotlinは、指定された受信者オブジェクトを使用して、手紙の数値値を呼び出す機能を提供します.関数ボリュームでは、追加の制限子を必要とせずに受信者オブジェクト上のメソッドを呼び出すことができます.これは、関数内で受信者オブジェクトのメンバーにアクセスできる拡張関数に似ています.
    package com.xingen.kotlin.day201761
    
    fun main(args: Array) {
    
        //         ,        
        println( 1.test6(2) )
        println( 1.test7(2) )
    }
    /***
     *       Lambda   
     *
     *                   :
     *
     * test6:Int.(other:Int)->Int
     */
    var test6:Int.(other:Int)->Int={ other->other+1}
    /**
     *           
     *
     *           :
     *
     * var test7=fun Int.(other:Int):Int=this+other
     *
     *   ,          ,         ,        
     */
    var test7=fun Int.(other:Int):Int{
        return this+other   //this         
    }

    出力結果は次のとおりです.
    3
    3