Kotlin語(yǔ)法手冊(cè)(二)
在使用kotlin時(shí),由于掌握的不夠牢靠,好多時(shí)候也還是Java編程的習(xí)慣,浪費(fèi)了kotlin提供的語(yǔ)言特性,方便性,間接性,在閱讀一些Android開(kāi)源庫(kù)的時(shí)候,由于好多都是kotlin語(yǔ)法編寫的,看的比較費(fèi)勁,還得去查閱kotlin的語(yǔ)法,比較不方便,故把kotlin的語(yǔ)法記錄下來(lái),方便查閱溫故,鞏固自己的基礎(chǔ)知識(shí)。
函數(shù)操作符
總數(shù)操作符
any
如果至少有一個(gè)元素符合給出的判斷條件,則返回 true
val list = listOf(1, 3, 5, 7, 9)
println(list.any { it > 13 }) //false
println(list.any { it > 7 }) //true
all
如果全部的元素符合給出的判斷條件,則返回 true
val list = listOf(1, 3, 5, 7, 9)
println(list.all { it > 13 }) //false
println(list.all { it > 0 }) //true
count
返回符合給出判斷條件的元素總數(shù)
val list = listOf(1, 3, 5, 7, 9)
println(list.count { it > 7 }) //1
println(list.count { it > 2 }) //4
fold
在一個(gè)初始值的基礎(chǔ)上從第一項(xiàng)到最后一項(xiàng)通過(guò)一個(gè)函數(shù)累計(jì)所有的元素
fun main() {
val list = listOf(1, 3, 5, 7, 9)
println(list.fold(2) { total, next->
println("$next , $total")
next + total
})
}
1 , 2//集合的第一個(gè)元素1,和初始化基礎(chǔ)值2
3 , 3//集合的第二個(gè)元素3,上次累加的1+2=3
5 , 6//集合的第三個(gè)元素5,上次累加的3+3=6
7 , 11//集合的第四個(gè)元素7,上次累加的5+6=11
9 , 18//集合的第五個(gè)元素9,上次累加的7+11=18
27//外層println(list...)輸入返回值9+18=27
foldRight
與 fold 一樣,但順序是從最后一項(xiàng)到第一項(xiàng)
val list = listOf(1, 3, 5, 7, 9)
println(list.foldRight(2) { next, total->
println("$next , $total")
next + total
})
9 , 2
7 , 11
5 , 18
3 , 23
1 , 26
27
forEach
val list = listOf(1, 3, 5, 7, 9)
list.forEach { print(it + 1) } //246810
forEachIndexed
類似于 forEach ,同時(shí)可以得到元素的索引
val list = listOf(1, 3, 5, 7, 9)
list.forEachIndexed { index, value -> println("$index value is $value") }
//輸入結(jié)果
0 value is 1
1 value is 3
2 value is 5
3 value is 7
4 value is 9
max
返回最大的一項(xiàng),如果沒(méi)有則返回null
val list = listOf(1, 3, 5, 7, 9)
println(list.max()) //9
maxBy
根據(jù)給定的函數(shù)返回最大的一項(xiàng),如果沒(méi)有則返回 null
val list = listOf(1, 3, 5, 7, 9)
println(list.maxBy { -it }) //1
min
返回最小的一項(xiàng),如果沒(méi)有則返回null
val list = listOf(1, 3, 5, 7, 9)
println(list.min()) //1
minBy
根據(jù)給定的函數(shù)返回最小的一項(xiàng),如果沒(méi)有則返回null
val list = listOf(1, 3, 5, 7, 9)
println(list.minBy { -it }) //9
none
如果沒(méi)有任何元素與給定的函數(shù)匹配,則返回true
val list = listOf(1, 3, 5, 7, 9)
println(list.none { it > 10 }) //true
reduce
與 fold 一樣,但是沒(méi)有一個(gè)初始值。通過(guò)一個(gè)函數(shù)從第一項(xiàng)到最后一項(xiàng)進(jìn)行累計(jì)
val list = listOf(1, 3, 5, 7, 9)
println(list.reduce { total, next ->
println("$next , $total")
total + next
})
3 , 1
5 , 4
7 , 9
9 , 16
25
reduceRight
與 reduce 一樣,但是順序是從最后一項(xiàng)到第一項(xiàng)
val list = listOf(1, 3, 5, 7, 9)
println(list.reduceRight { next, total ->
println("$next , $total")
total + next
})
7 , 9
5 , 16
3 , 21
1 , 24
25
sumBy
返回所有每一項(xiàng)通過(guò)函數(shù)轉(zhuǎn)換之后的數(shù)據(jù)的總和
val list = listOf(1, 3, 5, 7, 9)
println(list.sumBy { it + 1 }) //30
過(guò)濾操作符
drop
返回包含去掉前n個(gè)元素的所有元素的列表
val list = listOf(1, 3, 5, 7, 9)
println(list.drop(2)) //[5, 7, 9]
dropWhile
返回從第一個(gè)開(kāi)始不符合給定函數(shù)的元素起之后的列表
val list = listOf(1, 3, 5, 7, 9, 2)
println(list.dropWhile { it < 4 }) //第1、2元素不符合函數(shù),故返回的列表時(shí)[5, 7, 9, 2]
dropLastWhile
從最后一項(xiàng)開(kāi)始,返回從開(kāi)始不符合給定函數(shù)的元素起之后的列表
val list = listOf(10, 1, 3, 5, 7, 9)
println(list.dropLastWhile { it > 4 }) //[10, 1, 3]
filter
過(guò)濾所有符合給定函數(shù)條件的元素
val list = listOf(1, 3, 5, 7, 9, 2)
println(list.filter { it < 4 }) //[1, 3, 2]
filterNot
過(guò)濾所有不符合給定函數(shù)條件的元素
val list = listOf(1, 3, 5, 7, 9, 2)
println(list.filterNot { it < 4 }) //[5, 7, 9]
filterNotNull
過(guò)濾所有元素中不是null的元素
val list = listOf(1, 3, 5, 7, 9, 2, null)
println(list.filterNotNull()) //[1, 3, 5, 7, 9, 2]
slice
過(guò)濾一個(gè)list中指定index的元素
val list = listOf(1, 3, 5, 7, 9, 2, null)
println(list.slice(listOf(0, 3))) //[1, 7]
take
返回從第一個(gè)開(kāi)始的n個(gè)元素
val list = listOf(1, 3, 5, 7, 9, 2, null)
println(list.take(2)) //[1, 3]
takeLast
返回從最后一個(gè)開(kāi)始的n個(gè)元素
val list = listOf(1, 3, 5, 7, 9, 2, null)
println(list.takeLast(2)) //[2, null]
takeWhile
返回從第一個(gè)開(kāi)始符合給定函數(shù)條件的元素
val list = listOf(1, 3, 5, -1, 7, 9, 2)
println(list.takeWhile { it > 2 }) //[]第一個(gè)元素就不符合
println(list.takeWhile { it > 0 }) //[1, 3, 5]
映射操作符
flatMap
遍歷所有的元素,為每一個(gè)創(chuàng)建一個(gè)集合,最后把所有的集合放在一個(gè)集合中
val list = listOf(1, 3, 5, -1, 7, 9, 2)
println(list.flatMap { listOf(it, it + 1) }) //[1, 2, 3, 4, 5, 6, -1, 0, 7, 8, 9, 10, 2, 3]
groupBy
返回一個(gè)根據(jù)給定函數(shù)分組后的map
val list = listOf(1, 3, 5, -1, 7, 9, 2)
println(list.groupBy { listOf(it) }) //{[1]=[1], [3]=[3], [5]=[5], [-1]=[-1], [7]=[7], [9]=[9], [2]=[2]}
println(list.groupBy { listOf(it, it + 1) }) //{[1, 2]=[1], [3, 4]=[3], [5, 6]=[5], [-1, 0]=[-1], [7, 8]=[7], [9, 10]=[9], [2, 3]=[2]}
map
返回一個(gè)每一個(gè)元素根據(jù)給定的函數(shù)轉(zhuǎn)換所組成的List。
val list = listOf(1, 3, 5, -1, 7, 9, 2)
println(list.map { listOf(it) }) //[[1], [3], [5], [-1], [7], [9], [2]]
println(list.map { listOf(it, it + 1) }) //[[1, 2], [3, 4], [5, 6], [-1, 0], [7, 8], [9, 10], [2, 3]]
mapIndexed
返回一個(gè)每一個(gè)元素根據(jù)給定的包含元素index的函數(shù)轉(zhuǎn)換所組成的List
val list = listOf(1, 3, 5, -1, 7, 9, 2)
println(list.mapIndexed { index, value -> index }) //[0, 1, 2, 3, 4, 5, 6]
println(list.mapIndexed { index, value -> index * value }) //[0, 3, 10, -3, 28, 45, 12]
mapNotNull
返回一個(gè)每一個(gè)非null元素根據(jù)給定的函數(shù)轉(zhuǎn)換所組成的List
val list = listOf(1, 3, 5, -1, 7, 9, null, 2)
println(list.mapNotNull { it }) //[1, 3, 5, -1, 7, 9, 2]
元素操作符
contains
如果指定元素可以在集合中找到,則返回true
val list = listOf(1, 3, 5, -1, 7, 9, null, 2)
println(list.contains(3)) //true
println(list.contains(13)) //false
elementAt
返回給定index對(duì)應(yīng)的元素,如果index數(shù)組越界則會(huì)拋出 IndexOutOfBoundsException
val list = listOf(1, 3, 5, -1, 7, 9, null, 2)
println(list.elementAt(3)) //-1
println(list.elementAt(6)) //null
elementAtOrElse
返回給定index對(duì)應(yīng)的元素,如果index數(shù)組越界則會(huì)根據(jù)給定函數(shù)返回默認(rèn)值
val list = listOf(1, 3, 5, -1, 7, 9, null, 2)
println(list.elementAtOrElse(3, { it * 2 })) //-1
println(list.elementAtOrElse(16, { it * 2 })) //越界,故返回32
elementAtOrNull
返回給定index對(duì)應(yīng)的元素,如果index數(shù)組越界則會(huì)返回null
val list = listOf(1, 3, 5, -1, 7, 9, null, 2)
println(list.elementAtOrNull(3)) //-1
println(list.elementAtOrNull(16)) //null
first
返回符合給定函數(shù)條件的第一個(gè)元素
val list = listOf(1, 3, 5, -1, 7, 9, 2)
println(list.first { it % 3 == 0 }) //3
firstOrNull
返回符合給定函數(shù)條件的第一個(gè)元素,如果沒(méi)有符合則返回null
val list = listOf(1, 3, 5, -1, 7, 9, 2)
println(list.firstOrNull { it % 3 == 0 }) //3
println(list.firstOrNull { it % 8 == 0 }) //null
indexOf
返回指定元素的第一個(gè)index,如果不存在,則返回 -1
val list = listOf(1, 3, 5, -1, 7, 9, 2)
println(list.indexOf(5)) //2
println(list.indexOf(12)) //-1
indexOfFirst
返回第一個(gè)符合給定函數(shù)條件的元素的index,如果沒(méi)有符合則返回 -1
val list = listOf(1, 3, 5, 1, 7, 9, 2)
println(list.indexOfFirst { it % 2 == 0 }) //6
println(list.indexOfFirst { it % 12 == 0 }) //-1
indexOfLast
返回最后一個(gè)符合給定函數(shù)條件的元素的index,如果沒(méi)有符合則返回 -1
val list = listOf(1, 3, 5, 6, 7, 9, 2)
println(list.indexOfLast { it % 2 == 0 }) //6
println(list.indexOfLast { it % 12 == 0 }) //-1
last
返回符合給定函數(shù)條件的最后一個(gè)元素
val list = listOf(1, 3, 5, 6, 7, 9, 2)
println(list.last { it % 2 == 0 }) //2
println(list.last { it % 3 == 0 }) //9
lastIndexOf
返回指定元素的最后一個(gè)index,如果不存在,則返回 -1
val list = listOf(1, 3, 2, 6, 7, 9, 2)
println(list.lastIndexOf(2)) //6
println(list.lastIndexOf(12)) //-1
lastOrNull
返回符合給定函數(shù)條件的最后一個(gè)元素,如果沒(méi)有符合則返回null
val list = listOf(1, 3, 2, 6, 7, 9, 2)
println(list.lastOrNull { it / 3 == 3 }) //9
println(list.lastOrNull { it == 10 }) //null
single
返回符合給定函數(shù)的單個(gè)元素,如果沒(méi)有符合或者超過(guò)一個(gè),則拋出異常
val list = listOf(1, 9, 2, 6, 7, 9, 2)
println(list.single { it % 7 == 0 }) //7
println(list.single { it == 2 }) //IllegalArgumentException
singleOrNull
返回符合給定函數(shù)的單個(gè)元素,如果沒(méi)有符合或者超過(guò)一個(gè),則返回null
val list = listOf(1, 9, 2, 6, 7, 9, 2)
println(list.singleOrNull { it % 7 == 0 }) //7
println(list.singleOrNull { it == 2 }) //null
生產(chǎn)操作符
partition
把一個(gè)給定的集合分割成兩個(gè),第一個(gè)集合是由原集合每一項(xiàng)元素匹配給定函數(shù)條 件返回 true 的元素組成,第二個(gè)集合是由原集合每一項(xiàng)元素匹配給定函數(shù)條件返回 false 的元素組成
val list = listOf(1, 9, 2, 6, 7, 9, 2)
val (list1, list2) = list.partition { it % 2 == 0 }
println(list1) //[2, 6, 2]
println(list2) //[1, 9, 7, 9]
plus
返回一個(gè)包含原集合和給定集合中所有元素的集合,因?yàn)楹瘮?shù)的名字原因,我們可以使用 + 操作符
val list1 = listOf(1, 9, 2, 6, 7, 9, 2)
val list2 = listOf(1, 2, 4, 6, 8, 10)
println(list1.plus(list2)) //[1, 9, 2, 6, 7, 9, 2, 1, 2, 4, 6, 8, 10]
println(list1 + list2) //[1, 9, 2, 6, 7, 9, 2, 1, 2, 4, 6, 8, 10]
zip
返回由 pair 組成的List,每個(gè) pair 由兩個(gè)集合中相同index的元素組成。這個(gè)返回的List的大小由最小的那個(gè)集合決定
val list1 = listOf(1, 9, 2, 6, 7, 9, 2)
val list2 = listOf(1, 2, 4, 6, 8, 10)
val list3 = list1.zip(list2)
println(list3.javaClass)
println(list3.get(0).javaClass)
println("${list3.get(0).first} , ${list3.get(0).second}")
list3.forEach { println(it) }
class java.util.ArrayList
class kotlin.Pair
1 , 1
(1, 1)
(9, 2)
(2, 4)
(6, 6)
(7, 8)
(9, 10)
unzip
從包含pair的List中生成包含List的Pair
val list1 = listOf(Pair("leavesC", 1), Pair("leavesC_2", 2), Pair("leavesC_3", 3))
val list2 = list1.unzip()
println(list2.javaClass)
println(list2.first)
println(list2.second)
順序操作符
reverse
返回一個(gè)與指定list相反順序的list
val list1 = listOf(Pair("leavesC", 1), Pair("leavesC_2", 2), Pair("leavesC_3", 3))
val list2 = list1.reversed()
println(list2) //[(leavesC_3, 3), (leavesC_2, 2), (leavesC, 1)]
sort
返回一個(gè)自然排序后的list
val list1 = listOf(2, 4, 1, 9, 5, 10)
val list2 = list1.sorted()
println(list2) //[1, 2, 4, 5, 9, 10]
val list3 = listOf("a", "c", "ab", "b", "cdd", "cda")
val list4 = list3.sorted()
println(list4) //[a, ab, b, c, cda, cdd]
sortBy
返回一個(gè)根據(jù)指定函數(shù)排序后的list
val list1 = listOf(2, 4, 1, 9, 5, 10)
val list2 = list1.sortedBy { it - 3 }
println(list2) //[1, 2, 4, 5, 9, 10]
sortDescending
返回一個(gè)降序排序后的List
val list1 = listOf(2, 4, 1, 9, 5, 10)
val list2 = list1.sortedDescending()
println(list2) //[10, 9, 5, 4, 2, 1]
sortDescendingBy
返回一個(gè)根據(jù)指定函數(shù)降序排序后的list
val list1 = listOf(2, 4, 1, 9, 5, 10)
val list2 = list1.sortedByDescending { it % 2 }
println(list2) //[1, 9, 5, 2, 4, 10]