当前位置: 首页 > 科技观察

大部分业务代码都是在处理数据!所以,效率很重要!!

时间:2023-03-17 20:10:02 科技观察

1。前言在写业务代码的时候,大部分代码其实都是在处理和展示数据。这些操作占用了我们大量的编码时间。从某个集合中找到满足某个限制条件的数据更为常见。最简单的方法就是使用循环遍历数据集合,找到我们需要的数据。funfindFive(){vallist=arrayListOf(1,2,3,4,5,6,7)valfindList=mutableListOf()for(iinlist){if(i>5){findList.add(i)}}//findList}大部分的数据收集操作都可以通过循环来解决。对于一些比较复杂的操作,比如从两个集合中求交集,可以通过两层嵌套循环来解决。除了使用粗略的循环来解决问题,我们还可以使用Kotlin为集合封装的一些高级函数,这样我们就可以更轻松地处理集合。上面示例中的需求可以通过使用Kotlin集合的高阶函数的一种方法来解决。valfindList=list.filter{it>5}集合的高阶函数,以及更多巧妙的使用方法。本文从业务场景入手,讲解Kotlin中集合相关的一些高阶函数的使用和场景。2.集合的高阶函数Kotlin原生支持Lambda表达式,所有的高阶函数都可以基于Lambda实现。如果我们需要实现一个公司的内部员工管理系统,那么我们首先要定义一个员工类(EmployeModel)。dataclassEmployeModel(varid:Long,//员工IDvarname:String,//姓名varage:Int,//agevardepartment:String,//部门varsalary:Int//salary){}//varlist=arrayListOf(EmployeModel(...),...)接下来,我们将围绕这个员工类实现各种必要的需求。2.1数据过滤要求:从给定的员工列表中,过滤掉所有月薪大于2w的员工。前面的例子中提到,对于数据过滤,可以使用.filter()方法。这个方法接受一个布尔类型的条件,它会返回所有满足这个条件的数据集合。最后还是返回一个List。varfindList=list.filter{it.salary>20000}.filter()方法其实是用for循环实现的,没什么高深的。除了filter()之外,Kotlin还提供了具有一些特殊条件的过滤器。例如:filterIndexed,用Index过滤。filterNot,过滤所有不符合条件的数据。这里我就不展开了。2.2数据排序要求:将给定的员工列表按照工资排序。通过sortedBy()方法,指定排序依据,它会按照指定的值进行自然排序。varfindList=list.sortedBy{it.salary}sortedBy()方法用于顺序排序。如果要倒序排序,可以使用sortedByDescending()方法。需要注意的是,除了sortedBy()之外,还有sortBy()和sortByDescending()方法。这两种方法的区别在于操作的集合和返回值。在Kotlin中,所有的集合都可以分为可变集合和不可变集合。sortBy/sortByDescending方法只能用于可变集合。它返回的是一个Unit类型的对象,会在集合上进行自排序。sortBy()方法返回一个新的排序集合。2.3集合切片要求:列出给定的员工,只显示前100名员工。如果要获取集合中的前N??名员工,可以使用take()方法。varfindList=list.take(100)类似于take()获取前N名员工,也可以使用takeLast()方法获取最后N名员工。更灵活的切片,比如取第10~20名员工,需要使用slice()方法。如果要截取一段连续的数据,可以使用IntRange类来指定。varfindList=list.slice(IntRange(10,20))slice()方法也支持直接指定集合的??下标获取不连续的数据,比如选取第1、10、25位的员工。varfindList=list.slice(arrayListOf(1,10,15))2.4集合转换需求:即将涨薪,一组员工的薪水要涨20%。然后需要批量上报一批员工信息,与服务器讨论。本次调薪只需要填报工号即可。最初,我们有一个员工类的集合List列表,但这个集合中充满了员工对象。在报告之前,我们需要将它们转换成一个列表。这里可以使用map()方法,可以对集合中的数据进行转换。varfindList=list.map{it.id}map()本来是没有索引的,如果需要索引,可以使用mapIndexed()方法。map()表示一对一的转换关系。如果你想做一对多,你可以使用flatMap()方法。flatMap()可以将每个元素转化为一个新的集合,然后将其展平为一个集合。2.5数据分组要求:将所有员工年龄分组为20岁。这种两点分组可以使用partition()方法。它需要制定一个分组条件,通过布尔类型区分,最后返回一个Pair对象。Pair.first是满足条件的集合,Pair.second是不满足条件的集合。varfindList=list.partition{it.age>20}findList.first.forEach{Log.i("cxmyDev","${it.name}大于20");}findList.second.forEach{Log.i("cxmyDev","${it.name}小于等于20");}这时候需求又变了,需要按照部门分组,公司可能比较多超过两个部门。在这种情况下,可以通过groupBy()方法进行分组。varfindList=list.groupBy{it.department}groupBy()方法会返回一个Map2.6其他操作前面介绍的这些Kotlin集合的高阶函数基本满足了我对集合的大部分操作。当然,Kotlin还有一些更丰富的高阶函数。有兴趣的可以直接查看_Collections.kt的源码。高阶函数之所以强大,更多的是因为它支持链式调用。我们可以通过非常清晰的代码结构来实现我们对集合的复杂需求。我敲敲脑袋举个例子,拿员工集合中A部门的员工,按照员工ID排序,取前100名员工的ID进行上报。varfindList=list.filter{"A".equals(it.department)}.sortedBy{it.id}.map{it.id}.take(100)是Kotlin高阶函数中复杂的集合操作,只需要一组链调用来实现。另外需要注意的是,高阶函数中的很多方法都不是线程安全的,所以在使用的时候需要考虑多线程场景下的同步问题。3.总结本文介绍了一些常用的集合操作函数。随着Kotlin版本的升级,将会增加更多的高级功能。更多细节请阅读源码或参考kotlin.collections文档。【本文为专栏作家“张扬”原创稿件,转载请微信♂联系作者获得授权】点此查看作者更多好文