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.局部函數和擴充
即可以在函數裡嵌套函數,外層函數調用内層函數。内層函數可以使用外層參數。