前言

记录一下Kotlin官方提供了一些定义好的高阶函数,方便自己查阅和学习。

正文

高阶函数操作集合

Kotlin标准库定义了大量的对于集合操作的函数,方便用户使用,下面列举几个比较常用的介绍。

查找元素操作

Collections中提供了一些常用的方法用于查找、匹配集合中的元素。

Kotlin中标准库中的高阶函数

上面每个方法都接收一个函数式表达式作为参数,并且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()方法用于在当前的集合中查找满足指定条件的一个元素。需要注意的是,满足条件的元素只能有一个,多个或者没有都会抛出异常。

  1. 一个和多个

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.
  1. 一个和没有

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]
  1. it > 1 第一个元素2大于1,继续查询,后面全部满足,输出全部的元素。

  2. it > 2 第一个原始2不大于2,也就是第一个元素都不满足,终止,输出空列表。

  3. 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中提供了一些常用的方法用于比较集合中的元素。

Kotlin中标准库中的高阶函数

  1. minBy()最小值

  2. maxBy()最大值

  3. 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]

标准库中的高阶函数

Kotlin中标准库中的高阶函数

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中的特殊函数简介》记录过。

@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)
}
  1. run()内部可通过this获取调用对象,并调用其方法。

  2. run()返回值为最后一行的值或者指定的return的表达式。

参考文章

  1. 《Kotlin从基础到实战》

  2. Kotlin中的特殊函数简介

相关文章

暂无评论

none
暂无评论...