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.局部函数和扩展
即可以在函数里嵌套函数,外层函数调用内层函数。内层函数可以使用外层参数。