初识Kotlin之集合 (2)

用Java语言开发时,给对象集合做排序是常有的业务逻辑。(Java8之后的写法不太了解)按照我之前工作中排序的代码其实也并不复杂,十行代码基本可以搞定一个排序逻辑。注意是一个,一个。业务中存在大量的排序需求,这种代码会反复出现。对于我这种佛系程序员兼CV高手而言,早已经习以为常了。但自从用了Kotlin的sortedBy方法后。突然觉得Kotlin用起来倍儿爽!

用Java7开发了几年,Java8只接触了一点皮毛,现在Java12都已经出来了。经常看到一些文章为了突出某个语言的强大,而去踩其他语言。我只想问:who are you?每个语言都有自己独特的一面.神仙打架,我们负责吃瓜就好。就懂点皮毛的人,瞎掺和啥?

Collections.sort(list,new Comparator () { @Override public int compare(Object o1, Object o2) { return o1.compareTo(e2); } });

用Kotlin语言开发时,我们不需要重复写类似上面的排序代码,Kotlin已经帮我们封装好了,只需要我们写需要排序的字段即可。其底层也是通过Java 的Collections.sort实现的。所有我们就放心大胆的用吧。

public inline fun <T, R : Comparable<R>> MutableList<T>.sortBy(crossinline selector: (T) -> R?): Unit { if (size > 1) sortWith(compareBy(selector)) } @kotlin.jvm.JvmVersion public fun <T> MutableList<T>.sortWith(comparator: Comparator<in T>): Unit { if (size > 1) java.util.Collections.sort(this, comparator) } 常用函数

sortedBy{} : 根据条件给集合升序,常用与给对象集合的某个字段排序,并返回排序后的集合,原集合顺序不变

reversed() : 集合反序。与降序不同,反序指的是和初始化的顺序相反

sorted() : 自然升序,常用于给普通集合排序

sortedDescending() : 自然降序

sortedByDescending{} : 根据条件给集合降序

ed结尾的排序方法,是不会对原集合进行修改,而是返回一个排序后的新集合。没有以ed结尾的方法恰恰相反 ---来自一个不严谨的总结

sortBy{} : 根据条件给原集合升序,常用与给对象集合的某个字段排序

sortByDescending{} : 根据条件给原集合降序

reverse() : 原集合反序

使用建议

千万不要把反序理解成了倒序,前车之鉴

sortBy方法是对原集合做排序操作,而sortedBy方法是返回一个排序后的新集合,原集合排序没有变

kotlin排序方法中可以用and,or 组装多个条件,但效果并不理想

基础用法 data class Person( var name: String = "", var age: Int = 0, var salary: Double = 0.0 ) val persons = mutableListOf(Person("n1", 20, 2000.0), Person("n2", 24, 4000.0), Person("n3", 28, 6000.0), Person("n4", 26, 8000.0), Person("n5", 34, 7000.0), Person("n6", 44, 5000.0)) persons.sortedBy { it.age }.map { println(it) } persons.map { it.age }.sorted() persons.sortBy { it.age } persons.reversed() 过滤元素

Java8也提供了Map和Filter函数用于转换和过滤对象,使开发变得更轻松,遥想当年在for循环里面加if语句。慢慢成了过去式。集合遍历之前先filter一下,已经成了我开发过程中不可或缺的一步。虽然 filter 函数相对于Kotlin的 getOrNull 和 sortedBy 函数,并没有给人一种眼前一亮的感觉。但它提高了代码的可读性和美观性。

常用函数

filter{...} : 过滤不满足条件的元素,返回只满足条件元素列表,不影响原集合

filterNot{...} : 和filter{}函数的功能相反

filterNotNull() : 过滤掉集合中为null的元素

filterIndexed{...} : 在filter{}函数上多了一个下标功能,可以通过索引进一步过滤

Kotlin的函数是见名知意,非常好用,上手也快,弄明白一个方法,其他方法都没大的问题

distinct() : 去除重复元素,返回元素的顺序和原集合顺序一致

distinctBy{...} : 根据操作元素后的结果去去重,去除的是操作前的元素

take(num) : 返回集合中前num个元素组成的集合

takeWhile{...} : 从第一个元素开始遍历集合,当出现第一个不满足条件元素时退出循环。返回所有满足条件的元素集合

takeLast(num) : 和take 函数相反,返回集合中后num个元素组成的集合

takeLastWhile{...} : 从最后一个元素开始遍历集合,当出现第一个不满足条件元素时退出循环。返回所有满足条件的元素集合

不要被这么多方法吓到,学了take函数的用法,takeLast、drop、dropLast的用法都可以猜到

drop(num) : 过滤集合中前num个元素

dropWhile{...} : 和执行takeWhile{...}函数后得到的结果相反

dropLast(num) : 过滤集合中后num个元素

dropLastWhile{...} : 和执行takeLastWhile{...}函数后得到的结果相反

slice(...) : 过滤掉所有不满足执行下标的元素。参数是下标集合或者是下标区间。

使用建议

以上Filter、Distinct、Take、Drop、Slice方法都返回一个处理后的新集合,不影响原集合

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpywpx.html