高階函數
-
- any
- all
- count
- none
- max
- min
- sum
- forEachIndexed
- drop 從前面丢棄元素
- dropLast 從後面丢棄元素
- groupBy 分組
- filter
- filterNot
-
- 例子1:操作List
- 例子2:操作Map
- 更多操作 filterKeys、filterValues
- take、takeLast
- sortedBy 排序
- map 資料結構變化
- 常用操作符
-
- 下标操作類
- 判斷類
- 過濾類
- 轉換類
- 排序類
any 隻要有一個符合就傳回true
val list = listOf<Int>(1,2,3,4,5,6)
//隻要list 中有一個是大于3就傳回true
val any= list.any { it>3 }
all 所有條件符合才傳回true
val list = listOf<Int>(1,2,3,4,5,6)
// list 中所有元素大于3就傳回true
val any= list.all { it>3 }
count 傳回符合條件的數目
val list = listOf<Int>(1,2,3,4,5,6)
var any = list.count { it > 5 }
none 如果沒有任何元素與給定的函數比對,則傳回true
val list = listOf<Int>(1,2,3,4,5,6)
var any = list.none { it > 5 }
max 傳回最大的值,如果沒有則傳回null ,min同理
val list = listOf<Int>(1,2,3,4,5,6)
var result = list.max()
min 傳回最小的值,如果沒有則傳回null
val list = listOf<Int>(1,2,3,4,5,6)
var result = list.min()
sum 傳回資料相加總數
val list = listOf<Int>(1,2,3,4,5,6)
var result = list.sum()
forEachIndexed 與foreach相同,但是可以得到index
val list = listOf<Int>(1,2,3,4,5,6)
var result = list.drop(2)
//丢棄前兩個元素,結果為:[3, 4, 5, 6]
val list = listOf<Int>(1,2,3,4,5,6)
var result = list.dropLast(2)
//丢棄後兩個元素,結果為:[1,2,3, 4]
groupBy 根據函數将集合分組,傳回map類型對象
val list = listOf<Int>(1,2,3,4,5,6,7,8,9,10)
//把 list 分為偶數和奇數
var result = list.groupBy { it % 2 == 0}
Log.e("zhaoyanjun:", "" + result)
結果:傳回的是 map 對象
{false=[1, 3, 5, 7, 9], true=[2, 4, 6, 8, 10]}
過濾list,符合過濾條件的就是過濾結果
var list = mutableListOf(1, 2, 3, 4)
var list2 = list.filter { it ->
it > 2
}
或者可以更短:
var list = mutableListOf(1, 2, 3, 4)
var list2 = list.filter {
it > 2
}
list2的結果是:
[3,4]
把符合條件的過濾掉,剩下的是結果。這個操作和 filter 相反。
var list = mutableListOf<Int>(1, 2, 3)
var list2 = list.filterNot { it > 2}
list2結果是:
[1,2]
var map = mutableMapOf<Int, String>()
map.put(0, "a")
map.put(1, "b")
map.put(2, "c")
var map2 = map.filterNot { it.key ==2 }
map2的結果是:
{0=a, 1=b}
var map = mutableMapOf<Int, String>()
var map2 = map.filterKeys { it == 3 } //過濾key
val map3 = map.filterValues { it == "a" } //過濾 value
take
是從集合中取前幾個元素
takeLast
是從集合中取後幾個元素
val list = mutableListOf<Int>(1,2,3,4)
var list2 = list.take(3) //結果:[1, 2, 3]
var list3 = list.takeLast(2) //結果:[2, 3, 4]
在
java
中,我們要對一個
list
排序,需要寫很多代碼,但是在
kotlin
中,就簡單很多了。
首先我們定義一個
User
類,這個類隻有兩個字段,分别是
id
,
name
,代碼如下:
class User(var id: Int, var name: String)
//定義三個 User 變量
var u1 = User(1,"張三")
var u2 = User(3,"李四")
var u3 = User(2,"王五")
//用list把三個變量裝起來
var list = listOf<User>(u1,u2,u3)
//對 id 字段進行排序,并把排序的結果指派給 list2
var list2 = list.sortedBy { it.id }
//輸出list2
list2.forEach {
Log.e("zhaoyanjun:", ""+ it.id + "" + it.name)
}
結果如下:
com.kotlin E/zhaoyanjun:: 1張三
com.kotlin E/zhaoyanjun:: 2王五
com.kotlin E/zhaoyanjun:: 3李四
需要注意的是:
1、使用
list.sortedBy
對 list 排序,但是 list 的順序并沒有發生就改變,還是原來的順序。
2、
sortedBy()
方法為順序排序,如果想要逆序排序,可以使用
sortedByDescending()
方法。
我們現在有一個需求,需要把所有的使用者的使用者名存在一個 list 裡面,就可以用 map 操作符。
var listName = list.map { it.name }
Log.e("zhaoyanjun:", "" + listName)
輸出結果:
[張三, 李四, 王五]
除此之外,還可以連續操作。比如,我們把使用者名字中最後一個取出來。
var listName = list.map { it.name }
.takeLast(1)
Log.e("zhaoyanjun:", "" + listName)
[王五]
- contains —— 判斷是否有指定元素
- elementAt —— 傳回對應的元素,越界會抛IndexOutOfBoundsException
- firstOrNull —— 傳回符合條件的第一個元素,沒有 傳回null
- lastOrNull —— 傳回符合條件的最後一個元素,沒有 傳回null
- indexOf —— 傳回指定元素的下标,沒有 傳回-1
- singleOrNull —— 傳回符合條件的單個元素,如有沒有符合或超過一個,傳回null
- any —— 判斷集合中 是否有滿足條件 的元素
- all —— 判斷集合中的元素 是否都滿足條件
- none —— 判斷集合中是否 都不滿足條件,是則傳回true
- count —— 查詢集合中 滿足條件 的 元素個數
- reduce —— 從 第一項到最後一項進行累計
- filter —— 過濾 掉所有 滿足條件 的元素
- filterNot —— 過濾所有不滿足條件的元素
- filterNotNull —— 過濾NULL
- take —— 傳回前 n 個元素
- map —— 轉換成另一個集合(與上面我們實作的 convert 方法作用一樣);
- mapIndexed —— 除了轉換成另一個集合,還可以拿到Index(下标);
- mapNotNull —— 執行轉換前過濾掉 為 NULL 的元素
- flatMap —— 自定義邏輯合并兩個集合;
- groupBy —— 按照某個條件分組,傳回Map;
- reversed —— 反序
- sorted —— 升序
- sortedBy —— 自定義排序
- sortedDescending —— 降序