天天看點

kotlin_函數定義與調用

1.建立集合

setOf()

,

listOf()

,

hashMapOf()

集合方法:

.last()

,

.max()

2.優化函數

背景:集合輸出格式

a.基本實作:

fun <T> joinToString(
        collection: Collection<T>,
        separator: String,
        prefix: String,
        postfix: String
):String {
    var result = StringBuilder(prefix)

    for((index,element) in collection.withIndex()){
        if(index > ) result.append(separator)
        result.append(element)
    }

    result.append(postfix)
    return result.toString()
}
           

b.命名參數

println(joinToString(listOf(1,21,3),separator = ";", prefix = "(",postfix = ")"))

c.預設參數值

fun <T> joinToString(
        collection: Collection<T>,
        separator: String = ",",
        prefix: String ="",
        postfix: String = ""
):String
           

3.擴充函數和屬性

a.給String擴充lastChar()函數

fun String.lastChar(): Char = get(length-)
           

b.導入和擴充函數

沖突情況下導入包可以使用

as

對擴充函數重命名

c.java使用擴充函數

将接受者對象作為第一個參數給擴充函數

d.作為擴充函數的工具函數

fun <T> Collection<T>.joinToString(
        collection: Collection<T>,
        separator: String = ",",
        prefix: String ="",
        postfix: String = ""
):String {
    var result = StringBuilder(prefix)

    for((index,element) in collection.withIndex()){
        if(index > ) result.append(separator)
        result.append(element)
    }

    result.append(postfix)
    return result.toString()
}
           

e.擴充函數不可重寫

f.擴充屬性

擴充String屬性

val String.lastChar: Char
    get() = get(length-)
           

擴充可變屬性

var StringBuilder.lastChar: Char
    get() = get(length-)
    set(value: Char) {
        this.setCharAt(length - , value)
    }
           

4.處理集合

a.可變參數

使用

vararg

讓函數支援任意數量參數

fun <T> listOf(vararg values: T): List<T> { }
           

使用展開運算符

*

來傳遞數組

var list = listOf("args:", *args)
    println(list)
           

b.中綴調用和解構聲明

val map = mapOf( to "one", to "two", to "three")
           

其中to是特殊的函數調用,叫做中綴調用

在中綴調用中,沒有添加額外的分隔符,函數名稱是直接放在目标對象名稱和參數之間的。

1 to "one"

1 to("one")

等價

要允許使用中綴符号調用函數,需要使用

infix

修飾符來标記它。

infix fun Any.to(other: Any) = Pair(this,other)
           

to函數傳回一個Pair類型的對象。

Pair是泛型,可以以下生成Pair稱之為解構聲明

5.字元串和正規表達式

a.分割字元串

kotlin的split函數有多個重載。用來承載正規表達式的值需要一個Regex類型,而不String。

等價的情況

a.使用string的擴充函數來解析檔案路徑

fun parsePath(path: String) {
    val direcory = path.substringBeforeLast("/")
    val fullName = path.substringAfterLast("/")

    val fileName = fullName.substringBeforeLast(".")
    val extension = fullName.substringAfterLast(".")

    println("Dir:$direcory,name: $fileName, ext: $extension ")
}
           

b.使用正規表達式解析檔案路徑

正則式寫在三重引号字元串中,不需要對特殊字元轉義

fun parsePath(path: String) {
    val regex = """(.+)/(.+)\.(.+)""".toRegex()
    val matchResult = regex.matchEntire(path)
    if(matchResult != null) {
        val (direcory, fileName, extension) = matchResult.destructured
        println("Dir: $direcory, name: $fileName, ext: $extension")
    }
}
           

6.局部函數和擴充

即可以在函數裡嵌套函數,外層函數調用内層函數。内層函數可以使用外層參數。