[kotlin]3章関数の定義と呼び出し-2

30268 ワード

3.4収集処理


コトリン言語特性

  • vararg:呼び出し時のパラメータ数が異なる可能性のある関数を定義できる
  • 中位関数呼び出し構文:一つのパラメータを使いやすい方法
  • 構造分解宣言:分解複合値、複数の変数に分けられる
  • JavaコレクションAPIの拡張


    last()

    val strings: List<String> = listOf("first", "second", "last")
    println(strings.last())
    
    >>> last
    実装は、次のリストの拡張関数によって実現されます.

    max()

    val numbers: Collection<Int> =setOf(1, 14, 2)
    println(numbers.max())
    →コードエラー1.4バージョン後に破棄され、maxOfNull()を使用します.

    かへんパラメータかんすう


    上で使用したlistOf()は次のように定義されています.
    public fun <T> listOf(vararg elements: T): List<T> = if (elements.size > 0) elements.asList() else emptyList()
  • ジャワの可変長因子:...
  • コトリンの可変長因子:パラメータの前vararg
  • 配列された要素を可変長パラメータとして渡す
    fun main(args: Array<String>) {
    	val list = listOf("args: ", *args)
    	println(list)
    }
  • スプレッドシート演算子*使用→Javaでは使用できない機能
  • 中尉コールと構造分解宣言

    val map = mapOf(1 to  "one", 7 to "seven", 53 to "fifty-three")
    に示すように、mapを作成すると、toはtoという一般的なメソッドを呼び出します.

    中尉コール

  • パラメータが1つしかない一般的な方法/拡張関数に使用可能
  • 使い方
  • infix関数宣言の前に変更者を追加
  • toを呼び出す一般的な方法:1.to("one")
  • to呼中尉:1 to(「one」)
  • 構造分解宣言

    infix fun Any.to(other: Any) = Pair(this, other)
    上記の宣言のto()はPairの構造分解宣言であり,2つの変数を直ちに初期化する.
    val (number, name) = 1 to "one"
  • 使用:Pairのみならず、他の対象にも適用
    for ((index, element) in collection.withIndex()) {
    	println("$index: $element")
    }
  • 文字列と正規表現の操作


    文字列の分割

  • ジャワの割れ:セパレータは通常式→.すべての文字を表す正規表現として解釈される
  • コートリンでの文字列分割

  • パラメータはRegexタイプを受け入れます.
    println("12.345-6.A".split("\\.|-".toRegex()))
    
    >>> [12, 345, 6, A]
    →エラーの正規表現構文はjavaと同じ

  • Java split overloading
    println("12.345-6.A".split(".", "-"))
    
    >>> [12, 345, 6, A]
    →複数の区切り文字を使用可能
  • 三重引用符文字列


    ディレクトリ、ファイル名、拡張子を使用してファイルパスを区切る
  • 方法1)コットリンク使用
  • 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")
    }
    
    fun main() {
        parsePath("/Users/yole/kotlin-book/chapter.doc")
    }
    
  • 方法2)正規式使用
  • 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")
        }
    }
    
    fun main() {
        parsePath("/Users/yole/kotlin-book/chapter.doc")
    }
    →""":三引用符文字列では、任意の文字がxをエスケープする必要があります.

    複数行の三重引用符文字列

    fun main() {
        val kotlinLogo = """| //
            .| //
            .|/\"""
        println(kotlinLogo.trimMargin("."))
    }
    
    >>> | //
    >>> | //
    >>> |/\
    文字列にテキストが含まれている場合は、→のように簡単に文字列に変換できます.

    ローカル関数の拡張

  • 抽出した関数を元の関数の内部に重ねる:一般的には1ステップだけ重ねることを推奨する
  • import java.lang.IllegalArgumentException
    
    class User(val id: Int, val name: String, val address: String)
    
    fun saveUser(user: User) {
        if (user.name.isEmpty()) {
            throw IllegalArgumentException("name null")
        }
    
        if (user.address.isEmpty()) {
            throw IllegalArgumentException("address null")
        }
    }
    
    fun main() {
        saveUser(User(1, "", ""))
    }
    →関数は複雑ではありませんが、検証コードが重複します
    import java.lang.IllegalArgumentException
    
    class User(val id: Int, val name: String, val address: String)
    
    fun saveUser(user: User) {
        fun validate(user: User, value: String, fieldName: String) {
            if (value.isEmpty()) {
                throw IllegalArgumentException("$[user.id]: null $fieldName")
            }
        }
        validate(user, user.name, "Name")
        validate(user, user.address, "Address")
    }
    
    fun main() {
        saveUser(User(1, "", ""))
    }
    →メソッドで重複する検証部分を抽出し、元の関数の内部に重ね合わせる
    →userオブジェクトをローカル関数に1つずつ渡す必要があります
    import java.lang.IllegalArgumentException
    
    class User(val id: Int, val name: String, val address: String)
    
    fun saveUser(user: User) {
        fun validate(value: String, fieldName: String) {
            if (value.isEmpty()) {
                throw IllegalArgumentException("$[user.id]: null $fieldName")
            }
        }
        validate(user.name, "Name")
        validate(user.address, "Address")
    }
    
    fun main() {
        saveUser(User(1, "", ""))
    }
    →ローカル関数を使用して、その属する外部関数のすべてのパラメータと変数を使用できます.
    import java.lang.IllegalArgumentException
    
    class User(val id: Int, val name: String, val address: String)
    
    fun User.validateBeforeSave(user: User) {
        fun validate(value: String, fieldName: String) {
            if (value.isEmpty()) {
                throw IllegalArgumentException("$[user.id]: null $fieldName")
            }
        }
        validate(name, "Name")
        validate(address, "Address")
    }
    
    fun saveUser(user: User) {
        user.validateBeforeSave(user)
    }
    
    fun main() {
        saveUser(User(1, "", ""))
    }
    →拡張関数として抽出
    :この検証ロジックは、ユーザー以外の場所では使用されないため、含めたくありません.