不太想用 “学Kotlin” 这样的字眼,因为热爱的想用的语言本身就是用着用着就熟悉了。
但所有人在入坑之前,大抵都会问这样的问题:“为什么要学这个(Kotlin)?”。还在观望的人哟,答案不是因为Kotlin成为了安卓的官方语言 ,也不是因为 “避免被时代淘汰所以要更新自己的知识库” 这样的混理由。
这篇文章写给观望Kotlin的朋友,想要 从小白角度说一下对Kotlin这门语言的直观感受,应该可以给出答案,帮助建立最感性的认知吧~
如果可以开心地敲代码
1. have fun
第一个感性的认知是函数,Koltin的函数形如
fun sayHello(){
Log.d(TAG, "Hello, Kotlin~!")
}
Kotlin 函数用的是fun关键词,巧妙指代function的意思,但总感觉有funny的意思。每敲一遍函数好像就会更快乐一些,对!就是这么不讲证据。
事实上,Kolin的快乐确实已深入骨髓地流淌在它的血液中,你可以在任何地方发现它。
举一些细小的栗子吧:
① 比如,你一定在Java中犯过字符串==
错误
在java中,==
是对比字符串地址
String a = "hello";
String b = "Kotlin";
String c = "helloKotlin";
String f = a + b;
//Java中, result为false
boolean result = (c == f);
而在kotlin中更符合我们理解的习惯,==
等同于.equls(..)
,仅===
代表比较对象地址。
//kotlin中, result为true
val result = (c == f)
此外,你可以用$
拼接字符串和属性,再也不用 +
这种笨方式了
//java
Log.d(TAG, "My Name is " + user.getName());
//kotlin
Log.d(TAG, "My Name is ${user.name}")
② 比如,对集合的操作变得如此容易
Kotlin集合中的Lamda实在太多,只有列举几个简单的展示Kotlin的风采啦
//kotlin中, 遍历每一个元素
list.forEach {
//it为遍历时的当前子元素
Log.d(TAG, "value is $it")
}
//kotlin中, 找出满足条件的元素
val positiveNumbers = list.filter { it > 0 }
//kotlin中, 把集合的元素全部乘以2
val newList = list.map{it * 2}
....
③ 再比如,更多的Lamda的书写方式
Kotlin的甜度不单单在集合,来爱上更多Lamda语法吧
//kotlin的类库对唯一参数的方法进行了优化,如绑定监听时
view.setOnClickListener{
//do your things!
...
}
//避免对象的重复样板代码,如用with(obj){..}的方式
with(bean){
/*
* 在adapter中通过对象提供显示数据的场景
* this.title等同于bean.title
* this可省略
*/
titleTv.text = this.title
titleTv.textSize = this.titileFontSize
contentTV.text = this.content
contentTV.textSize = this.contentFontSize
}
...
语法糖的作用,与其说为了增加工作效率,不如说是让我们编码更加开心。是真甜呀,毕竟大段冗长的代码就像 * 一样的存在,爱了爱了。
2. 我想“惜码如金”
继续说
我相信每一个工程师都会对代码简洁有严重的偏执,类似于孩童的一种情绪,如果能极简地编写逻辑,一定会有一种“高级感”油然而生。
Kotlin的极简除了各类的语法糖外,还在与引入 特殊类data class 和 object单例身上
① 想要Bean类?写一个data class就好了
以下这一行代码,等同于 一字不落地创建Java中的bean类。
/*
使用一行代码创建一个包含 getters、 setters、
`equals()`、 `hashCode()`、 `toString()` 以及 `copy()` 的bean类
*/
data class Customer(val name: String, val email: String, val company: String)
② 想要单例?创建一个 object 就可以了
// 创建一个object
object Singleton {
val companyName: String = "JetBrains"
}
在Java中调用Kotlin的 object 是这样的:Singleton.INSTANCE
这既证明了object 是不择不扣的单例,也说明了与Java良好的互通性。
3.Coding的更多的可能
除了 “更好的Java” 思想外,在设计上,Kotlin就已经与Java有明显的区别:
① 这是一个空安全的世界
i. 剔除null的对象
我们需要一些前置的知识,在Kotlin中,默认类型是非空的,而 可空类型 则需要在类型后加?
。如:
//name是一个非null字符串,后续也不能再赋予null值
var name : String = "JetBrains"
//companyName是一个可空字符串,可赋值为null
var companyName : String? = null
非空对象赋值为null时会报错:
可空对象的方法/属性直接调用也会报错:
Kotlin承诺: 对于非空类型不管如何使用都不会产生空安全问题,对于可空类型则拒绝直接调用其属性或方法,所以Kotlin是空安全的。
这样,我们终于逃脱了每次使用前都需要判断非空的地狱。
😡😠
ii. 可空对象的操作
对于可空类型的操作(为了兼容Java,避免不了Null的引入),Kotlin的处理也可以说非常优雅。
(1) ?.
的空不受理
//当companyName为null时, 不执行.后的内容,返回为null
companyName?.length
(2)!!
的非空断言
//自信断言companyName一定不为null, 为null则抛出异常
companyName!!.length
(3)?:
的空则赋值
//当companyName为null时, 赋值为"JetBrains"
companyName?:"JetBrains"
//甚至可以这样写,抛出异常
companyName?:throw NullPointerException("companyName is null")
② 函数大行其道
函数编程无疑是更火热和具有可能性的存在,这一点Kotlin也进行了很好的支持。
i.函数作为参数传递
fun sayHello(){
Log.d(TAG, "Hello, Kotlin~!")
}
//参数为一个 无参且返回值为Unit的函数,如sayHello()
fun doSomething(dothing: () -> Unit) {
//执行传入的函数
dothing()
}
---
//函数doSomething的调用方式
doSomething(this::sayHello)
在上述代码中,doSomething传入一个无参且返回值为Unit的函数,并执行该函数
我们甚至可以在调用时再新定义所需的函数,如
//这是一个Lamda表达式,等价于doSomething({...})
doSomething{
Log.d(TAG, "Hello, Kotlin~!")
}
可见,函数的大行其道无疑给Coding带来了更多可能性。
ii.扩展函数的使用
拓展函数完成 轻简地给某一既定类型添加方法 的实现
以MutableList<Int>
为例,我们给它写一个常用的 exchange/交换 方法
//原本MutableList<Int>是没有exchange方法的,现在给它拓展一个
fun MutableList<Int>.exchange(fromIndex:Int, toIndex:Int){
val temp = this[fromIndex]
this[fromIndex] = this[toIndex]
this[toIndex] = temp
}
----
//我们就可以很方便对该函数进行调用了
val list = mutableListOf(1,2,3)
//调用MutableList<Int>的扩展函数
list.exchange(1,2)
这样,我们重新理解了开闭原则,再也不用在强行继承和苦涩扩展的漩涡里打转。
以上…
未来的事情
相信你已经建立了感性的认知!
对Kotlin的认知可以用三个词语概括:快乐、实用、匹配。 快乐是无处不在的语法糖,实用是因为简明的特殊类和类型扩展等语法,匹配指与Java的完全兼容,与安卓开发需求所吻合的设计。
期待你寻找Kotlin的宝藏!
目前 Kotlin 和 Flutter 是安卓世界里最热门的两个话题,前者是Google推行的安卓官方语言,后者是跨平台的UI框架。
.
对Kotlin 和 Flutter 不太熟悉的同学,附上其他大牛博主的文章:
郭霖 - Kotlin vs Flutter,我到底应该怎么选?
恋猫de小郭 - 未来Android的从业方向
恋猫de小郭 - 谁告诉你 Flutter 会干掉原生开发?