| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> 为数不多的人知道的-Kotlin-技巧以及-原理解析(二),一年后斩获腾讯T3 -> 正文阅读 |
|
[移动开发]为数不多的人知道的-Kotlin-技巧以及-原理解析(二),一年后斩获腾讯T3 |
val name = target.ifEmpty { “dhl” } 其原理跟我们使用 if 表达式是一样的,来分析一下源码。 public inline fun <C, R> C.ifEmpty(defaultValue: () -> R): R where C : CharSequence, C : R =
除了? val input = “123” 其实这种写法存在一定问题,假设输入字符串并不是纯数字,例如? val input = “123” 避免将解构声明和数据类一起使用这是 Kotlin 团队一个建议:避免将解构声明和数据类一起使用,如果以后往数据类添加新的属性,很容易破坏代码的结构。我们一起来思考一下,为什么 Kotlin 官方会这么说,我先来看一个例子:数据类和解构声明的使用。 // 数据类 fun main(args: Array) { fun printlnPeople(people: People) { 输出结果如下所示: name: dhl 随着需求的变更,需要给数据类 People 添加一个新的属性 age。 // 数据类,增加了 age fun main(args: Array) { 此时没有更改解构声明,也不会有任何错误,编译输出结果如下所示: name: dhl 得到的结果并不是我们期望的,此时我们不得不更改解构声明的地方,如果代码中有多处用到了解构声明,因为增加了新的属性,就要去更改所有使用解构声明的地方,这明显是不合理的,很容易破坏代码的结构,所以一定要避免将解构声明和数据类一起使用。当我们使用不规范的时候,并且编译器也会给出警告,如下图所示。 [图片上传失败…(image-bb59b4-1594646872317)] 文件的扩展方法Kotlin 提供了很多文件扩展方法?Extensions for? File(“dhl.txt”).useLines { line ->
public inline fun File.useLines(charset: Charset = Charsets.UTF_8, block: (Sequence) -> T): T =
那它是如何在读取完毕自动关闭的呢,核心在? public inline fun <T : Closeable?, R> T.use(block: (T) -> R): R { 其实很简单,调用? inline fun <T, R> T.dowithTry(block: (T) -> R) { // 使用方式 当然这只是一个非常简单的异常捕获方法,在实际项目中还有很多需要去处理的,比如说异常信息需不需要返回给调用者等等。 在上文中提到了调用? Sequence 和 Iterator 不同之处为什么 Kolin 会返回 Sequence,而不返回 Iterator?其实这个核心原因由于 Sequence 和 Iterator 实现不同导致?内存?和?性能?有很大的差异。 接下来我们围绕这两个方面来分析它们的性能,Sequences(序列) 和 Iterator(迭代器) 都是一个比较大的概念,本文的目的不是去分析它们,所以在这里不会去详细分析 Sequence 和 Iterator
,只会围绕着?内存?和?性能?两个方面去分析它们的区别,让我们有一个直观的印象。更多信息可以查看国外一位大神写的文章?Prefer Sequence for big collections with more than one processing step。 Sequence 和 Iterator 从代码结构上来看,它们非常的相似如下所示: interface Iterable { interface Sequence { 除了代码结构之外,Sequences(序列) 和 Iterator(迭代器) 它们的实现完全不一样。 Sequences(序列)Sequences 是属于懒加载操作类型,在 Sequences 处理过程中,每一个中间操作不会进行任何计算,它们只会返回一个新的 Sequence,经过一系列中间操作之后,会在末端操作? [图片上传失败…(image-643844-1594646872316)] 在 Sequences 处理过程中,会对单个元素进行一系列操作,然后在对下一个元素进行一系列操作,直到所有元素处理完毕。 val data = (1…3).asSequence() // 输出 F1, M1, E2, F2, F3, M3, E6 [图片上传失败…(image-28a57e-1594646872316)] 如上所示:在 Sequences 处理过程中,对 1 进行一系列操作输出? 在 Sequences 处理过程中,每一个中间操作( map、filter 等等 )不进行任何计算,只有在末端操作( toList、count、forEach 等等方法 ) 进行求值运算,如何区分是中间操作还是末端操作,看方法的返回类型,中间操作返回的是 Sequence,末端操作返回的是一个具体的类型( List、int、Unit 等等 )源码如下所示。 // 中间操作 map ,返回的是 Sequence // 末端操作 toList 返回的是一个具体的类型(List) // 末端操作 forEachIndexed 返回的是一个具体的类型(Unit)
Iterator(迭代器)在 Iterator 处理过程中,每一次的操作都是对整个数据进行操作,需要开辟新的内存来存储中间结果,将结果传递给下一个操作,代码如下所示: val data = (1…3).asIterable() // 输出 F1, F2, F3, M1, M3, E2, E6 [图片上传失败…(image-dae99a-1594646872315)] 如上所示:在 Iterator 处理过程中,调用 filter 方法对整个数据进行操作输出? // 每次操作都会开辟一块新的空间,存储计算的结果 // 每次操作都会开辟一块新的空间,存储计算的结果 对于每次操作都会开辟一块新的空间,存储计算的结果,这是对内存极大的浪费,我们往往只关心最后的结果,而不是中间的过程。 了解完 Sequences 和 Iterator 不同之处,接下里我们从?性能?和?内存?两个方面来分析 Sequences 和 Iterator。 Sequences 和 Iterator 性能对比分别使用 Sequences 和 Iterator 调用它们各自的 filter、map 方法,处理相同的数据的情况下,比较它们的执行时间。 使用 Sequences : val time = measureTimeMillis { println(time) // 1197 使用 Iterator : val time2 = measureTimeMillis { println(time2) // 23641 Sequences 和 Iterator 处理时间如下所示:
这个结果是很让人吃惊的,Sequences 比 Iterator 快 19 倍,如果数据量越大,它们的时间差距会越来越大,当我们在读取文件的时候,可能会进行一系列的数据操作? Sequences 和 Iterator 内存对比这里使用了?Prefer Sequence for big collections with more than one processing step?文章的一个例子。 有 1.53 GB 犯罪分子的数据存储在文件中,从文件中找出有多少犯罪分子携带大麻,分别使用 Sequences 和 Iterator,我们先来看一下如果使用 Iterator 处理会怎么样(这里调用? File(“ChicagoCrimes.csv”).readLines() 运行完之后,你将会得到一个意想不到的结果? Exception in thread “main” java.lang.OutOfMemoryError: Java heap space 调用 readLines 函返回一个集合,有 3 个中间操作,每一个中间操作都需要一块空间存储 1.53 GB 的数据,它们需要占用超过 4.59 GB 的空间,每次操作都开辟了一块新的空间,这是对内存巨大浪费。如果我们使用序列 Sequences 会怎么样呢?(调用? File(“ChicagoCrimes.csv”).useLines { lines -> 没有出现? 便捷的 joinToString 方法的使用
|
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 8:25:40- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |