Kotlin-性能优化利器-——-Sqeuence-原理浅析,app架构图

users.map(User :: sex)
     .filter {it.sex.equals("male")}

序列的用法

序列的用法很简单,只需要再集合后添加asSeqence() 函数即可

users.asSequence()
     .map(User :: sex)
     .filter {it.sex.equals("male")}

这里插播一个概念,其中 User :: user 是成员引用,具体介绍如下

成员引用(Member References)

概念

成员引用可以使你方便的调用某个类的成员,这个成员包括对应类的属性或方法.双冒号前的是被引用的类,双冒号后是需要返回的属性或方法名,如下所示是返回 User 成员的 sex 属性:

User :: sex

成员引用可以方便的赋值给其他变量或函数,例如上述寻找性别为 male 的例子,也可以用稍微复杂的写法,如下:

users.map(user : User -> user.sex)
     .filter {it.sex.equals("male")}

可见成员引用的写法可读性更强。

再谈序列

让我们回到序列介绍。上文提到使用 mapfilter 时,都会在函数内部创建中间集合,这会导致一个问题,如果源列表,就是 users 中元素特别多,集合的链式处理会变得十分低效,原因是创建了多次中间集合。而如果先将待处理集合通过 asSequence() 方法转换为序列,再进行 mapfilter 操作,就会变得十分高效。对于是否使用序列进行集合操作,有几个前提,如果使用不当,反而会造成性能损失。这里总结一下使用场景:

序列性能测试

上文提到,是否使用序列的条件之一是处理大量数据,那么这个阈值究竟是多少?下面来进行一个性能测试,构造一个商品列表,其中每个商品包含商品名和价格两个属性,现在要求出对每个商品的价格加价 100 后,价格为奇数 的商品的个数,这里用到了 count() 方法,作用是求得集合内满足 count 条件的元素的个数,代码如下:

/**
 * 商品类
 */
data class Commodity(var name: String, var price: String)

import java.util.*

fun main(args: Array<String>) {

    val commodityList = ArrayList<Commodity>()

    for (i in 0..1000000) {
        val goods = Commodity("商品 $i", i * 5)
        commodityList.add(goods)
    }

    val startTime = System.currentTimeMillis()

    commodityList
            .asSequence() // 使用此函数代表使用 Kotlin 序列功能
            .map { it.price + 100 }
            .count { it % 2 != 0 }

    println("consume time is ${System.currentTimeMillis() - startTime} ms")

}

测试结果折线图如下,其中横坐标为集合内元素的个数,纵坐标为代码执行时间,橙色线代表未使用序列,蓝色线代表使用序列:

表格对比如下:

由图可得出如下结论:

  • 上文提到的阈值大致为「一百万」个元素,大于该阈值时,使用序列大致能带来 90 % 的性能提升
  • 在小于「十万」个元素时,使用序列反而会造成性能下降

总结

可以看出,笔者的工作学习模式便是由以下 「六个要点」 组成:

❝ 多层次的工作/学习计划 + 番茄工作法 + 定额工作法 + 批处理 + 多任务并行 + 图层工作法❞

希望大家能将这些要点融入自己的工作学习当中,我相信一定会工作与学习地更富有成效。

下面是我学习用到的一些书籍学习导图,以及系统的学习资料。每一个知识点,都有对应的导图,学习的资料,视频,面试题目。

**如:我需要学习 **Flutter的知识。(大家可以参考我的学习方法)

CodeChina开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》
  • Flutter 的思维导图(无论学习什么,有学习路线都会事半功倍)

  • Flutter进阶学习全套手册

  • Flutter进阶学习全套视频

阶学习全套手册**

[外链图片转存中…(img-OeynBDKv-1630579568984)]

  • Flutter进阶学习全套视频

[外链图片转存中…(img-eXFr03CS-1630579568985)]

大概就上面这几个步骤,这样学习不仅高效,而且能系统的学习新的知识。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值