Kotlin 高阶操作符

一、总数操作符

### any操作符

    val list = listOf(1, 3, 5, 7, 9)
    println(list.any { it > 13 })  //false
    println(list.any { it > 7 })   //true

### all操作符

    val list = listOf(1, 3, 5, 7, 9)
    println(list.all { it > 13 })  //false
    println(list.all { it > 0 })   //true

### count操作符

    val list = listOf(1, 3, 5, 7, 9)
    println(list.count { it > 7 })  //1
    println(list.count { it > 2 })  //4

### fold操作符

    在一个初始值的基础上从第一项到最后一项通过一个函数累计所有的元素

        val list = listOf(1, 3, 5, 7, 9)
        println(list.fold(2) { total, next->
            println("fold ----  $next , $total")
            next + total
        })
        log日志 
         fold ----  1 , 2
         fold ----  3 , 3	
         fold ----  5 , 6
         fold ----  7 , 11
         fold ----  9 , 18
         27

### foldRight操作符

    与 fold  一样,但顺序是从最后一项到第一项

    val list = listOf(1, 3, 5, 7, 9)
    println(list.foldRight(2) { next, total->
        println("$next , $total")
        next + total
    })
log日志 
     fold ----  9 , 2
     fold ----  7 , 11	
     fold ----  5 , 18
     fold ----  3 , 23
     fold ----  1 , 26
     27

### forEach操作符

    val list = listOf(1, 3, 5, 7, 9)
    list.forEach { print(it + 1) } //2,4,6,8,10

### forEachIndexed操作符

 	val list = listOf(1, 3, 5, 7, 9)
    list.forEachIndexed { index, value -> println("$index value is $value") }

### max操作符

    val list = listOf(1, 3, 5, 7, 9)
    println(list.max()) //9

### maxBy操作符

    根据给定的函数返回最大的一项,如果没有则返回 null

    val list = listOf(1, 3, 5, 7, 9)
    println(list.maxBy { -it }) //1

### min操作符

    返回最小的一项,如果没有则返回null

    val list = listOf(1, 3, 5, 7, 9)
    println(list.min()) //1

### minBy操作符

    根据给定的函数返回最小的一项,如果没有则返回null

    val list = listOf(1, 3, 5, 7, 9)
    println(list.minBy { -it }) //9

### none操作符

    如果没有任何元素与给定的函数匹配,则返回true

    val list = listOf(1, 3, 5, 7, 9)
    println(list.none { it > 10 }) //true

### reduce操作符

    与 fold  一样,但是没有一个初始值。通过一个函数从第一项到最后一项进行累计

    val list = listOf(1, 3, 5, 7, 9)
    println(list.reduce { total, next ->
        println("$next , $total")
        total + next
    })
log日志
    3 , 1
    5 , 4
    7 , 9
    9 , 16
    25

#### reduceRight

    与 reduce  一样,但是顺序是从最后一项到第一项

    val list = listOf(1, 3, 5, 7, 9)
    println(list.reduceRight { next, total ->
        println("$next , $total")
        total + next
    })
log日志
    7 , 9
    5 , 16
    3 , 21
    1 , 24
    25

#### sumBy

    返回所有每一项通过函数转换之后的数据的总和

    val list = listOf(1, 3, 5, 7, 9)
    println(list.sumBy { it + 1 }) //30

 二、过滤操作符

### drop

返回包含去掉前n个元素的所有元素的列表

    val list = listOf(1, 3, 5, 7, 9)
    println(list.drop(2)) //[5, 7, 9]

#### dropWhile

    返回从第一个开始不符合给定函数的元素起之后的列表

    val list = listOf(1, 3, 5, 7, 9, 2)
    println(list.dropWhile { it < 4 }) //[5, 7, 9, 2]

#### dropLastWhile

    从最后一项开始,返回从开始不符合给定函数的元素起之后的列表

  val list = listOf(10, 1, 3, 5, 7, 9)
  println(list.dropLastWhile { it > 4 }) //[10, 1, 3]

#### filter

    过滤所有符合给定函数条件的元素

  val list = listOf(1, 3, 5, 7, 9, 2)
  println(list.filter { it < 4 }) //[1, 3, 2]

#### filterNot

    过滤所有不符合给定函数条件的元素

    val list = listOf(1, 3, 5, 7, 9, 2)
    println(list.filterNot { it < 4 }) //[5, 7, 9]

#### filterNotNull

    过滤所有元素中不是null的元素

    val list = listOf(1, 3, 5, 7, 9, 2, null)
    println(list.filterNotNull()) //[1, 3, 5, 7, 9, 2]

#### slice

    过滤一个list中指定index的元素

    val list = listOf(1, 3, 5, 7, 9, 2, null)
    println(list.slice(listOf(0, 3))) //[1, 7]

#### take

    返回从第一个开始的n个元素

    val list = listOf(1, 3, 5, 7, 9, 2, null)
    println(list.take(2)) //[1, 3]

#### takeLast

    返回从最后一个开始的n个元素

    val list = listOf(1, 3, 5, 7, 9, 2, null)
    println(list.takeLast(2)) //[2, null]

#### takeWhile

    返回从第一个开始符合给定函数条件的元素。

    val list = listOf(1, 3, 5, -1, 7, 9, 2)
    println(list.takeWhile { it > 2 }) //[]
    println(list.takeWhile { it > 0 }) //[1, 3, 5]

三、映射操作符

#### flatMap

    遍历所有的元素,为每一个创建一个集合,最后把所有的集合放在一个集合中

    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

    返回一个根据给定函数分组后的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 

     返回一个每一个元素根据给定的函数转换所组成的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 

    返回一个每一个元素根据给定的包含元素index的函数转换所组成的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 

    返回一个每一个非null元素根据给定的函数转换所组成的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对应的元素,如果index数组越界则会抛出 IndexOutOfBoundsException

    val list = listOf(1, 3, 5, -1, 7, 9, null, 2)
    println(list.elementAt(3)) //-1
    println(list.elementAt(6)) //null

#### elementAtOrElse 

    返回给定index对应的元素,如果index数组越界则会根据给定函数返回默认值

    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对应的元素,如果index数组越界则会返回null

    val list = listOf(1, 3, 5, -1, 7, 9, null, 2)
    println(list.elementAtOrNull(3))  //-1
    println(list.elementAtOrNull(16)) //null

### first 

    返回符合给定函数条件的第一个元素

    val list = listOf(1, 3, 5, -1, 7, 9, 2)
    println(list.first { it % 3 == 0 })  //3

#### firstOrNull 

    返回符合给定函数条件的第一个元素,如果没有符合则返回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 

    返回指定元素的第一个index,如果不存在,则返回 -1

    val list = listOf(1, 3, 5, -1, 7, 9, 2)
    println(list.indexOf(5))  //2
    println(list.indexOf(12)) //-1

#### indexOfFirst 

    返回第一个符合给定函数条件的元素的index,如果没有符合则返回 -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 

    返回最后一个符合给定函数条件的元素的index,如果没有符合则返回 -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 

    返回符合给定函数条件的最后一个元素

    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 

    返回指定元素的最后一个index,如果不存在,则返回 -1

    val list = listOf(1, 3, 2, 6, 7, 9, 2)
    println(list.lastIndexOf(2))    //6
    println(list.lastIndexOf(12))   //-1

#### lastOrNull 

    返回符合给定函数条件的最后一个元素,如果没有符合则返回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 

    返回符合给定函数的单个元素,如果没有符合或者超过一个,则抛出异常

    val list = listOf(1, 9, 2, 6, 7, 9, 2)
    println(list.single { it % 7 == 0 })  //7
    println(list.single { it == 2 })      //IllegalArgumentException

#### singleOrNull 

    返回符合给定函数的单个元素,如果没有符合或者超过一个,则返回null

    val list = listOf(1, 9, 2, 6, 7, 9, 2)
    println(list.singleOrNull { it % 7 == 0 })  //7
    println(list.singleOrNull { it == 2 })      //null

五、生产操作符 

### partition 

    把一个给定的集合分割成两个,第一个集合是由原集合每一项元素匹配给定函数条 件返回 true 的元素组成,第二个集合是由原集合每一项元素匹配给定函数条件返回 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 

    返回一个包含原集合和给定集合中所有元素的集合,因为函数的名字原因,我们可以使用 + 操作符

    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,每个 pair 由两个集合中相同index的元素组成。这个返回的List的大小由最小的那个集合决定

    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) }
log日志
    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)
log日志
    class kotlin.Pair
    [leavesC, leavesC_2, leavesC_3]
    [1, 2, 3]

六、顺序操作符 

### reverse 

    返回一个与指定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 

    返回一个自然排序后的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 

    返回一个根据指定函数排序后的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 

    返回一个降序排序后的List

    val list1 = listOf(2, 4, 1, 9, 5, 10)
    val list2 = list1.sortedDescending()
    println(list2) //[10, 9, 5, 4, 2, 1]

### sortDescendingBy 

    返回一个根据指定函数降序排序后的list

    val list1 = listOf(2, 4, 1, 9, 5, 10)
    val list2 = list1.sortedByDescending { it % 2 }
    println(list2) //[1, 9, 5, 2, 4, 10]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值