为数不多的人知道的-Kotlin-技巧以及-原理解析(二),一年后斩获腾讯T3

本文介绍了Kotlin中避免解构声明与数据类一起使用的原因,强调了文件扩展方法的便利性和Sequence与Iterator的性能与内存差异。通过实例展示了Sequence在处理大量数据时的优势,以及joinToString方法的灵活性。通过理解这些技巧,可以优化代码并提高开发效率。
摘要由CSDN通过智能技术生成

val name = target.ifEmpty { “dhl” }
复制代码

其原理跟我们使用 if 表达式是一样的,来分析一下源码。

public inline fun <C, R> C.ifEmpty(defaultValue: () -> R): R where C : CharSequence, C : R =
if (isEmpty()) defaultValue() else this
复制代码

ifEmpty 方法是一个扩展方法,接受一个 lambda 表达式 defaultValue ,如果是空字符串,返回 defaultValue,否则不为空,返回调用者本身。

除了 ifEmpty 方法,Kotlin 库中还封装很多其他非常有用的字符串,例如:将字符串转为数字。常见的写法如下所示:

val input = “123”
val number = input.toInt()
复制代码

其实这种写法存在一定问题,假设输入字符串并不是纯数字,例如 123ddd 等等,调用 input.toInt() 就会报错,那么有没有更好的写法呢?如下所示。

val input = “123”
// val input = “123ddd”
// val input = “”
val number = input.toIntOrNull() ?: 0
复制代码

避免将解构声明和数据类一起使用

这是 Kotlin 团队一个建议:避免将解构声明和数据类一起使用,如果以后往数据类添加新的属性,很容易破坏代码的结构。我们一起来思考一下,为什么 Kotlin 官方会这么说,我先来看一个例子:数据类和解构声明的使用。

// 数据类
data class People(
val name: String,
val city: String
)

fun main(args: Array) {
// 编译测试
printlnPeople(People(“dhl”, “beijing”))
}

fun printlnPeople(people: People) {
// 解构声明,获取 name 和 city 并将其输出
val (name, city) = people
println(“name: ${name}”)
println(“city: ${city}”)
}
复制代码

输出结果如下所示:

name: dhl
city: beijing
复制代码

随着需求的变更,需要给数据类 People 添加一个新的属性 age。

// 数据类,增加了 age
data class People(
val name: String,
val age: Int,
val city: String
)

fun main(args: Array) {
// 编译测试
printlnPeople(People(“dhl”, 80, “beijing”))
}
复制代码

此时没有更改解构声明,也不会有任何错误,编译输出结果如下所示:

name: dhl
city: 80
复制代码

得到的结果并不是我们期望的,此时我们不得不更改解构声明的地方,如果代码中有多处用到了解构声明,因为增加了新的属性,就要去更改所有使用解构声明的地方,这明显是不合理的,很容易破坏代码的结构,所以一定要避免将解构声明和数据类一起使用。当我们使用不规范的时候,并且编译器也会给出警告,如下图所示。

[图片上传失败…(image-bb59b4-1594646872317)]

文件的扩展方法

Kotlin 提供了很多文件扩展方法 Extensions for java.io.Reade :

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值