Kotlin学习之常用高阶函数:filter

Kotlin学习之常用高阶函数:filter

Kotlin高阶函数一般是数组、集合、序列等数据结构的扩展函数,接收一个操作函数对数据进行操作,在Kotlin函数式编程中占有重要的地位。

一、filter系列

filter是“过滤器”的意思,Kotlin提供了多个相似的高阶函数。

这是扩展的filter函数,它接受一个(T)->Boolean类型的函数,返回。但是它并不自己执行操作,而是新建一个ArrayList作为操作目标,然后把这个ArrayList和传入函数打包送给filterTo函数处理:

filterTo()函数会遍历数组内的元素,验证每个元素是否符合predicate函数,如果符合就把它添加到目标集合destination中,也就是说filter函数返回所有传入函数为true的元素。

与filter相似的还有以下几个:

filterNot()filterNotTo():与filter相反,这两个函数会过滤出不符合条件的元素;

filterIndexed()filterIndexedTo():这两个函数接受(Int,T)->Boolean类型的函数,同时检查索引和元素是否符合条件;

filterNotNull()filterNotNullTo():这两个函数都会过滤出非空元素;

filterIsInstance()filterIsInstanceTo():这两个函数都能过滤出特定类型的元素,可以指定一个Class对象。

二、示例

给一个长度为 n 的数组,每个元素都在 [1,n] 之间,要求找出 [1,n] 中没有在数组里出现的元素。

代码如下:

解释:

首先定义一个长度为nums长度+1的Boolean数组ifAppear(BooleanArray与Java的boolean[]相同,默认值为false)

通过forEach()函数遍历传入数组,将ifAppear数组中下标等于nums元素的项设为true

使用mapIndexed()函数将ifAppear的元素映射到一个新的List里,如果index为0或者值为true,就映射为-1,否则映射为下标;最后用filter过滤出所有不为-1的元素,返回过滤后的List。

如果是使用Java,,我们就需要两次for循环,分别遍历nums和ifAppear,而Kotlin通过函数式编程,把循环封装在高阶函数内部,这样既有利于简化代码,降低出错的概率,更利于多线程和的实现

学海无涯苦作舟

本文来自企鹅号 - Android成长录媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android干货

浅谈Kotlin(三):类

13840
来自专栏python3

python3--小数据池,is,字符编码

python3x中的str在内存中的编码方式是unicode. python3x中的str不能直接存储和发送

23210
来自专栏Java帮帮-微信公众号-技术文章全总结

【选择题】Java基础测试七

【选择题】Java基础测试七 86.欲构造ArrayList类的一个实例,此类继承了List接口,下列哪个方法是正确的?( B ) A、ArrayList m...

65430
来自专栏技术墨客

JVM与字节码——2进制流字节码解析 原

本位将详细介绍字节码的2进制结构和JVM解析2进制流的规范。规范对字节码有非常严格的结构要求,其结构可以用一个JSON来描述:

11020
来自专栏Linux驱动

快速排序(详解)

描述: 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序...

20290
来自专栏lgp20151222

排序算法对比,步骤,改进,java代码实现

发现是时候总结一番算法,基本类型的增删改查的性能对比,集合的串并性能的特性,死记太傻了,所以还是写在代码里,NO BB,SHOW ME THE CODE!

10120
来自专栏决胜机器学习

《Redis设计与实现》读书笔记(六) ——Redis中的压缩列表

《Redis设计与实现》读书笔记(六) ——Redis中的压缩列表 (原创内容,转载请注明来源,谢谢) 一、概述 压缩列表(ziplist)是列表键(list)...

40070
来自专栏开发与安全

从零开始学C++之从C到C++(一):const与#define、结构体对齐、函数重载name mangling、new/delete 等

一、bool 类型 逻辑型也称布尔型,其取值为true(逻辑真)和false(逻辑假),存储字节数在不同编译系统中可能有所不同,VC++中为1个字节。 声明方式...

20100
来自专栏Java帮帮-微信公众号-技术文章全总结

第十三天 面向对象-final static 匿名对象内部类包代码块【悟空教程】

15240
来自专栏Android Note

Kotlin —  lateinit vs lazy

12530

扫码关注云+社区

领取腾讯云代金券