天天看点

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.局部函数和扩展

即可以在函数里嵌套函数,外层函数调用内层函数。内层函数可以使用外层参数。