Kotlin中标准库中的高阶函数

Android  Kotlin  2024年10月9日 pm6:21发布2个月前更新 城堡大人
74 0 0

前言

记录一下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中的特殊函数简介

 历史上的今天

  1. 2019: 莫泊桑:瞎子(0条评论)
版权声明 1、 本站名称: 笔友城堡
2、 本站网址: https://www.biumall.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权,请留言

暂无评论

暂无评论...

随机推荐

bat脚本的变量初始化

前言 简单记录一下bat脚本(批处理文件)初始化变量和计数的使用。记录于此,方便自己查阅。正文初始化变量# 初始化count为0set /a count=0# 普通字符set read=BiuMall​# 有特殊字符set "read=Biu&Mall"#...

Web网站置灰的几种方式代码

前言众所周知,一般有大事情,很多官方网站的首页就会置灰。对这个比较感兴趣,因此就查询了一下,发现设置全站置灰的方式很简单。记录一下,方便自己查阅。PS: 本文内容摘抄的,文末有原作者连接正文置灰涉及全屏置灰,另外一种是首屏置灰。下面记录一下置灰的代码。全屏置灰方式一亲测,有效。...

Bing(必应)不收录网站或被K的申诉方法

前言简单记录一下Bing不收录或被kill问题。我这站之前是有收录的,不知道为啥突然Bing不显示收录的内容了。正文这里只是记录一下,以前被kill也是这样解决的。第一步登入Bing站长工具官网https://www.bing.com/webmasters/home如果没有注册就新注...

Android中persistent属性的简介

前言在Android中,有些应用没有通过Service或者Broadcast等启动他,但Application还是被启动了。经过查阅资料和看代码,发现android:persistent="true"的妙用之处。实现Application,然后AndroidManifest.xml中注册Ap...

王蒙:永远的巴金

在这个星空之夜,巴金走了。如果设想一下近百年来最受欢迎和影响最大的一部长篇小说,我想应该是巴金的《家》。早在小时候,我的母亲与姨母就在议论鸣凤和觉慧,梅表姐和琴,觉新觉民高老太爷和老不死的冯乐山,且议且叹,如数家珍。而等到我自己迷于阅读的时候,我宁愿读《灭亡》和《新生》,因为这两本书里写了革命,...

Android磁盘之Vold启动

前言Volume Daemon,简写Vold,用于管理和控制Android平台外部存储设备的后台进程。这些管理或控制包括SD卡的插拔事件检测/SD卡挂载/卸载/格式化等。记录一下Vold进程启动的源码分析,方便自己查阅。Android P这里很多都是网上的,我就走走流程。正文先看看...