asSequence 对提升效率大有裨益,其他的操作就不一一列举了。
重载是很比较常见的操作,但是有时候这种方式会出现很多相同的模板代码。Kotlin的默认参数,可以给参数指定默认值,并且在调用的时候像给变量赋值一样给参数赋值而不用像Java一样非要按照顺序去传值。并且因为具有默认值的原因,所以调用的时候可以根据具体情况传递参数,更加灵活、更加易读和简洁。
class Point(val x: Float = 0F, val y: Float = 0F)
val x = Point(x = 10F)// x 10 y 0
val y = Point(y = 10F)// x 0 y 10
val xy = Point(x = 10F, y = 10F)// x10 y10
开发中Bean文件是必不可少的,但是Java的Bean文件大部分都是模版代码,虽然有插件自动生成,但是依然会觉得比较繁琐,Kotlin可以将这些类申明为Data类,这些类会默认实现equals(),hashCode(),toString() 和copy() 方法,从几十行Java代码简洁到几行代码,Kotlin只用声明 一个data class。
data class Person(
val name: String,
val age: Int,
val sex: Int
){
//…
}
这是Kotlin提供的函数库,使用后会简化不少的样板代码。稍微不一样的地方是它们的this和it各自指向不一样,以及返回值得不一样,使用得时候根据具体得情况来就可以了。
run
val str = “a”
val res = str.run{
// this 指向 “a” it没有指向
// 可以直接访问对象得属性
print(length)
1 // 最后一行返回值为1
}
let
val str = “a”
val res = str.let{
// this 指向当前class
// it 指向a
print(it.length)
“let” // 返回值"let"
}
with
val res = with(user){
// this 指向user it无指向
println(age)
println(name)
“with” // 返回值
}
apply
val str = “a”
val res = a.apply{
// this指向a it 无指向
2 // 返回值
}
对于Java的switch再熟悉不过,但是它使用起来有比较多的限制,有时候面对复杂的逻辑会显得乏力。Kotlin的when表达式可以匹配几乎任何东西(字面值,枚举,数字,范围,类型,表达式,甚至函数(kotlin函数至上)) 简单感受下:
fun whenTest(number: Number?): String {
return when (number) {
null, 0 -> “empty”
1 -> “tiny”
in 2…5 -> “small”
is Long -> “big number”
else -> “unKnow”
}
}
当然有时候使用when会有一些比较麻烦的事情,比如对else情况的处理,因为你的程序中明明只有这么几种情况,但是你却不得不写上关于else的情况处理,这样的代码让人觉得不安心,也降低了可读性,这个时候可以结合Koltin的密封类来处理,比如对网络情况的回执,对错误的处理,Android对RecyclerView的适配中多中ViewHolder的处理。
// 密封类的存在让整个过程中可能出现的情况更加严谨
sealed class NetWorkResult
data class Success(val resJson: String) : NetWorkResult()
data class Failure(val error: Error) : NetWorkResult()
// 代码更加易读
fun netWorkTest(result: NetWorkResult) {
when (result) {
is Success -> {
showResult(result.resJson)
}
is Failure -> {
showError(result.error)
}
}
}
扩展可能是最受欢迎的一个特性,因为它可以让你少写很多工具类,并且让代码看起来更易读,更简洁。比如做一个防止重复点击的操作。
// 扩展点击事件属性(重复点击时长)
var T.lastClickTime: Long
set(value) = setTag(1766613352, value)
get() = getTag(1766613352) as? Long ?: 0
// 重复点击事件绑定
inline fun T.singleClick(time: Long = 800, crossinline block: (T) -> Unit) {
setOnClickList
ener {
val currentTimeMillis = System.currentTimeMillis()
if (currentTimeMillis - lastClickTime > time || this is Checkable) {
lastClickTime = currentTimeMillis
block(this)
}
}
}
一开始我并没有注意到这个特性,因为项目是组件化开发,在跳转传值上都采用了ARouter,但是当我发现Kotlin对这个做的改造的时候还是非常开心~
// 创建Bundle 和创建map 一样优雅
val bundle = bundleOf(
“KEY_ONE” to 1,
“KEY_TWO” to 2L,
“KEY_THREE” to true
)
// 再也不用写繁琐的Parcelable实现
@Parcelize
data class Person(val name:String):Parcelable
一开始我并没有注意到这个特性,因为项目是组件化开发,在跳转传值上都采用了ARouter,但是当我发现Kotlin对这个做的改造的时候还是非常开心~
// 创建Bundle 和创建map 一样优雅
val bundle = bundleOf(
“KEY_ONE” to 1,
“KEY_TWO” to 2L,
“KEY_THREE” to true
)
// 再也不用写繁琐的Parcelable实现
@Parcelize
data class Person(val name:String):Parcelable