目录
前言
记录一下Kotlin官方提供了一些定义好的高阶函数,方便自己查阅和学习。
正文
高阶函数操作集合
Kotlin标准库定义了大量的对于集合操作的函数,方便用户使用,下面列举几个比较常用的介绍。
查找元素操作
Collections中提供了一些常用的方法用于查找、匹配集合中的元素。
上面每个方法都接收一个函数式表达式作为参数,并且Interable为集合的基类,所以在实现的过程中可以直接通过集合对象来调用方法即可。
find()
find()方法用于查找并返回指定条件的第1个元素,没有找到符合条件的元素返回null。
var list = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9) Log.d(TAG, "WaterTest : " + list.find { it % 2 == 0 }) Log.d(TAG, "WaterTest : " + list.find { it % 100 == 0 })
输出结果
WaterTest : 2 WaterTest : null
first()
first()方法用于查找并返回指定条件的第1个元素,如果查找时没有找到匹配的元素,会在运行时抛出异常。
var list = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9) Log.d(TAG, "WaterTest : " + list.first() { it % 2 == 0 }) Log.d(TAG, "WaterTest : " + list.first() { it % 100 == 0 })
输出结果
WaterTest : 2 FATAL EXCEPTION: main Process: com.biumall.k, PID: 5171 java.lang.RuntimeException: Unable to create application com.biumall.k.KApp: java.util.NoSuchElementException: Collection contains no element matching the predicate.
找到就返回,没找到就crash。
last()
last()方法用于查找并返回指定条件的最后1个元素,如果查找时没有找到匹配的元素,会在运行时抛出异常。
跟上面类似,改为last()即可。
single()
single()方法用于在当前的集合中查找满足指定条件的一个元素。需要注意的是,满足条件的元素只能有一个,多个或者没有都会抛出异常。
-
一个和多个
var list = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9) Log.d(TAG, "WaterTest : " + list.single() { it == 1 }) Log.d(TAG, "WaterTest : " + list.single() { it % 2 == 0 })
输出
WaterTest : 1 FATAL EXCEPTION: main Process: com.biumall.k, PID: 5417 java.lang.RuntimeException: Unable to create application com.biumall.k.KApp: java.lang.IllegalArgumentException: Collection contains more than one matching element.
-
一个和没有
var list = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9) Log.d(TAG, "WaterTest : " + list.single() { it == 1 }) Log.d(TAG, "WaterTest : " + list.single() { it % 100 == 0 })
输出
WaterTest : 1 Shutting down VM FATAL EXCEPTION: main Process: com.biumall.k, PID: 5563 java.lang.RuntimeException: Unable to create application com.biumall.k.KApp: java.util.NoSuchElementException: Collection contains no element matching the predicate.
takeWhile()
这个方法很神奇,查询时,如果第一个元素(或前一个元素)不满足条件,就不会查找第二个元素(或下一个元素),也就是终止了。
var list = listOf( 2, 4, 5, 6, 7, 8, 9) Log.d(TAG, "WaterTest : " + list.takeWhile { it > 1 }) Log.d(TAG, "WaterTest : " + list.takeWhile { it > 2 }) Log.d(TAG, "WaterTest : " + list.takeWhile { it % 2 == 0 })
输出结果
WaterTest : [2, 4, 5, 6, 7, 8, 9] WaterTest : [] WaterTest : [2, 4]
-
it > 1 第一个元素2大于1,继续查询,后面全部满足,输出全部的元素。
-
it > 2 第一个原始2不大于2,也就是第一个元素都不满足,终止,输出空列表。
-
it % 2 == 0 第一个元素2满足,继续下一个元素4,也满足,再下一个原始5不满足,终止,输出[2,4]
稍微不看定义,这takeWhile()就把人给绕进去了。
filter()
过滤满足条件的所有元素。
var list = listOf( 2, 4, 5, 6, 7, 8, 9) Log.d(TAG, "WaterTest : " + list.filter { it > 2 }) Log.d(TAG, "WaterTest : " + list.filter { it % 2 == 0 })
输出
WaterTest : [4, 5, 6, 7, 8, 9] WaterTest : [2, 4, 6, 8]
比较实用的。
count()
统计个数。
var list = listOf( 2, 4, 5, 6, 7, 8, 9) Log.d(TAG, "WaterTest : " + list.count())
输出
WaterTest : 7
比较元素操作
Collections中提供了一些常用的方法用于比较集合中的元素。
-
minBy()最小值
-
maxBy()最大值
-
distinctBy()去除重复元素
var list = listOf(2, 4, 5, 4, 2, 7, 8, 9) Log.d(TAG, "WaterTest : " + list.minBy { it }) Log.d(TAG, "WaterTest : " + list.maxBy { it }) Log.d(TAG, "WaterTest : " + list.distinctBy { it })
输出
WaterTest : 2 WaterTest : 9 WaterTest : [2, 4, 5, 7, 8, 9]
标准库中的高阶函数
repeat()
repeat()函数用于重复执行某条语句,它和循环语句非常相似,但是用起来会方便一些。
@kotlin.internal.InlineOnly public inline fun repeat(times: Int, action: (Int) -> Unit) { contract { callsInPlace(action) } for (index in 0 until times) { action(index) } }
第一个参数是次数,第二个是函数类型参数。
repeat(2, { Log.d(TAG, "WaterTest : ") }) //另外一种写法 repeat(2) { Log.d(TAG, "WaterTest : ") }
T.run()
这个在《》记录过。
@kotlin.internal.InlineOnly public inline fun <T, R> T.run(block: T.() -> R): R { contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) } return block() }
作用:执行一个代码块并返回其结果。
run()在内部运行对象是通过this访问的,当您想要调用对象的方法而不是将其作为参数传递时,这是很有用的。
比如list添加数据一般的写法
var list = ArrayList<Int>() list.add(1) list.add(2) list.add(3) list.add(100)
每次都要调佣list,这里可以使用run(),效果跟上面一样。
var list = ArrayList<Int>() list.run { //这里省略了this //this.add(1) add(1) add(2) add(3) add(100) }
-
run()内部可通过this获取调用对象,并调用其方法。
-
run()返回值为最后一行的值或者指定的return的表达式。
参考文章
-
《Kotlin从基础到实战》
-
《