関数の定義と呼び出し

6737 ワード

1、kotlinで集合を作成する
kotlinは独自の集合クラスではなくjavaの集合クラスを採用していますが、書き方は違います.
val set=hashSetOf(1,7,53) //  hashset
val list=arrayListOf(1,7,53)   //ArrayList
val map=hashMapOf(1 to "one",7 to "seven",53 to "fifty-three")//HashMap

しかしkotlinには、last()、max()の集合の最後の要素と最大の要素という独自の方法があります.
2、関数をよりよく呼び出す
JAvaのセットにはデフォルトのtoString()が実装されていますが、出力フォーマットは固定されています.
val list=listOf(1,2,3)//listOf    (Arrays   ArrayList)
println(list)
  :[1,2,3]

以上の結果は固定フォーマットである、デフォルトではtoString()が実現される.
fun  joinToString(collection:Collection,separator:String,prefix:String,postfix:String):String{
    val result=StringBuilder(prefix)
    for((index,element) in collection.withIndex()){
    if(index>0) result.append(separator)
    result.append(element)
    }
    result.append(postfix)
    return result.toString()
}
val list=listOf(1,2,3)
println(joinToString(list,"; ","(",")"))
  :(1;2;3)

コレクションの出力フォーマットを変更したい場合は、カンマでセミコロンを変更するようにカスタマイズできます.
2.1命名パラメータ
上記の例では、joinToString(list,";","(",")")を見ると、上記の対応する関数宣言を見つけなければ、私たちが何を書いているのかをよりよく理解できないことがわかります.この問題を解決するために、kotlinは名前付きパラメータを引き出します.kotlinカスタム関数を呼び出すと、いくつかのパラメータの名前を明示的に表示できます.
joinToString(list,separator=";",prefix="(",postfix=")")

2.2デフォルトパラメータ値
関数を宣言するときは、パラメータのデフォルト値を指定し、リロードされた関数の作成を避けることができます.
fun  joinToString(collection:Collection,separator:String,prefix:String,postfix:String):String

呼び出すときはすべてのパラメータでこの関数を呼び出すか、一部のパラメータを省略することができます.
3、拡張関数と属性
Kotlinはクラスの属性とメソッドを拡張することができ、Decoratorモードを継承したり使用したりする必要はありません.拡張は静的挙動であり,拡張されたクラスコード自体に影響を及ぼさない.
3.1関数のインポートと拡張
拡張関数は既存のクラスに新しいメソッドを追加でき、元のクラスは変更されません.拡張関数の定義形式:
fun receiverType.functionName(params){
    body
}
  • receiverType:関数の受信者、すなわち関数拡張のオブジェクトを表す
  • functionName:拡張関数の名前
  • params:拡張関数のパラメータ、NULLの次のインスタンスにUserクラスを拡張できます:
  • class User(var name:String)
    
    /**    **/
    fun User.Print(){
        print("    $name")
    }
    
    fun main(arg:Array){
        var user = User("Runoob")
        user.Print()
    }
             :
        Runoob

    次のコードは、MutableListにswap関数を追加します.
    //      swap,        
    fun MutableList.swap(index1: Int, index2: Int) {
        val tmp = this[index1]     //  this      
        this[index1] = this[index2]
        this[index2] = tmp
    }
    
    fun main(args: Array) {
    
        val l = mutableListOf(1, 2, 3)
        //    0   2       
        l.swap(0, 2) // 'swap()'      'this'     'l'   
    
        println(l.toString())
    }
             :
    [3, 2, 1]

    3.2書き換え不可能な拡張関数
    拡張関数は静的に解析され、受信者タイプの仮想メンバーではありません.拡張関数を呼び出すときに、どの関数が呼び出されるかは、動的タイプではなく、呼び出し関数のオブジェクト式によって決定されます.
    open class C
    
    class D: C()
    
    fun C.foo() = "c"   //      foo
    
    fun D.foo() = "d"   //      foo
    
    fun printFoo(c: C) {
        println(c.foo())  //     C  
    }
    
    fun main(arg:Array){
        printFoo(D())
    }
             :
    c

    拡張関数とメンバー関数が一致する場合、この関数を使用する場合は、メンバー関数が優先されます.
    class C {
        fun foo() { println("    ") }
    }
    
    fun C.foo() { println("    ") }
    
    fun main(arg:Array){
        var c = C()
        c.foo()
    }
             :
        

    3.3拡張属性
    関数に加えて、Kotlinは属性の拡張もサポートしています.
    val  List.lastIndex: Int
        get() = size - 1

    拡張プロパティでは、クラスまたはkotlinファイルで定義できますが、関数では定義できません.初期化プロパティは、プロパティにバックエンドフィールドがないため、初期化は許可されず、明示的に提供されるgetter/setterでのみ定義できます.
    val Foo.bar = 1 //   :           

    拡張プロパティはvalとしてのみ宣言できます.
    4、可変パラメータ、接尾辞呼び出しとライブラリのサポート
    4.1 java集合のAPIを拡張する
    fun  List.last():T//        
    fun Collection.max():Int//         

    なぜkotlinはjavaの集合を使っているのに、自分で増やした方法を追加できるのでしょうか.関数lastとmaxは拡張関数として宣言された.
    4.2可変パラメータ:関数に任意の数のパラメータをサポートさせる
    可変パラメータのキーワードvarargは、関数が任意の数のパラメータfun listOf(vararg values:T):List{...}kotlinライブラリでlistOf()関数をこのように定義する可能性があることを宣言するために使用できます.そのため、私たちが呼び出したときに任意の数のパラメータをkotlinとjavaに渡すことができるもう一つの違いは、渡す必要があるパラメータが配列にパッケージされているときに、関数の構文を呼び出すことです.Javaでは配列をそのまま渡すことができ、kotlinでは配列を明示的に解く必要があります.これを展開演算子と呼び、パラメータの前に*を付けます.
    fun main(args:Array){
        val list=listOf("args: ",*args)
        println(list)
    }

    4.3キー値ペアの処理:接尾辞コールとリビルド宣言
    val map=mapOf(1 to "one",7 to "seven",53 to "fifty-three")

    この行コードの単語toは内蔵構造ではなく、接尾辞呼び出しと呼ばれる特殊な関数呼び出しである.
    再構築宣言:接尾辞呼び出しは、通常の関数でも拡張関数でも、1つのパラメータしかない関数とともに使用できます.呼び出し関数に接尾辞を使用することを許可するには、infix修飾子を使用してマークする必要があります.
    infix fun Any.to(other:Any)=Pair(this,other)

    Pairの内容を直接使って2つの変数を初期化することができます.val(number,name)=1 to「one」という機能を解構宣言と呼ぶ.
    5、文字列と正規表現の処理
    5.1分割文字列
    println("12.345-6.A".split("\\.|-".toRegex()))
      :[12,345,6,A]

    kotlinは、異なるパラメータを持つsplitという名前のリロードされた拡張関数をいくつか提供します.正規表現をロードする値にはStringではなくRegexタイプが必要です.上記の例では、拡張関数toRegexを使用して文字列を正規表現に変換します.ただし、単純な場合には正規表現を使用する必要はありません.kotlinのsplit拡張関数のその他のリロードでは、任意の数の純粋なテキスト文字列区切り文字がサポートされます.
    println("12.345-6.A".split(".","-"))
    [12,345,6,A]

    5.2正規表現と三重引用符の文字列
    ファイルパスを解析します:/Users/yole/kolin-book/chapter.doc 1 Stringの拡張関数を使用してファイルパスを解析します.
    fun parsePath(path:String){
        val directory=path.substringBeforeLast("/")
        val fullName=path.substringAfterLast("/")
        val fileName=fullName.subStringBeforeLast(".")
        val extension=fullName.subStringAfterLast(".")
        println("Dir:$directory,name:$fileName,ext:$extension")
    }
    parsePath("/Users/yole/kolin-book/chapter.doc")
      :Dir:Users/yole/kolin-book,name:chapter,ext:doc

    ②正規表現でファイルパスを解析する
    fun parsePath(path:String){
        val regex="""(.+)/(.+)\.(.+)""".toRegex()
        val matchResult=regex.matchEntire(path)
        if(matchResult!=null){
            val (directory,filename,extension)=matchResult.destructured
            println("Dir:$directory,name:$fileName,ext:$extension")
        }
    }

    三重引用符文字列は任意の文字をエスケープする必要はありません.最初の(.+)には最後の斜線前の文字列が含まれます.2番目の文字列には最後の点前の文字列が含まれ、3番目の文字列には残りの部分が含まれます.
    5.3複数行の三重引用符の文字列
    三重引用符文字列は、エスケープ文字を回避するだけでなく、改行文字を含む任意の文字を含むことができます.また、改行文字を含むテキストをプログラムに埋め込む簡単な方法を提供します.
    val kotlinLogo="""| //
                     .|//
                     .|/ \"""
    println(kotlinLogo.trimMargin("."))
      : | //
          |//
          |/ \