最近稍微抽空看了下kotlin,总的来说用起来还是不错的,因为没有细细去学习,所以只了解了最基本的用法。
使用起来和java的语法大同小异,不过有一些比较有意思的特性,可以减小代码量和使代码更优雅。
其实说白了就是语法糖,然而架不住大家就喜欢,哎
用的好的话,确实可以减少代码量,提高开发效率。
所以下面就来看看kotlin的语法糖奇技淫巧吧
data类
java的pojo类实际上就是一大堆胶水代码,极大的阻碍了开发速度的提升。虽然有各种各样的自动生成,但是总觉得原生支持才带劲
例子:
data class User(var name:String?,var id:Long)
一行搞定,自动重写了如下方法:
- equals()/hashCode()
- toString()方法
- componentN()方法
- copy()方法
基本上一行解决,非常简洁。
并且得益于这个代码量,可以把一个项目里所有的pojo类写在一个.kt
文件下,还不是美滋滋?
什么,你说get/set?开玩笑,kotlin的类默认可是public的,直接赋值就完事了
when
例子:
override fun onClick(v: View?) {
when (v!!.id) {
R.id.btn_login ->
doLogin()
R.id.agreement_check_box ->
btnLogin.isEnabled = agreementCheckBox.isChecked
}
}
逻辑类似于java里面的switch case
,不同之处在于 使用范围更广,比如可以用来判断类型
when (a) {
is String ->
...
is Date ->
...
}
还可以用来返回值
val res = when {
s == null -> null
s.contains("detail") -> "detail"
else -> ""
}
apply let
例子:
MessageEvent().apply {
tag = mTag
object = datas.get(position)
}.let { EventUtils.postSticky(it) }
这段翻译成java是这样:
MessageEvent m = new MessageEvent()
m.tag = mTag
m.object = datas.get(position)
EventUtils.postSticky(m)
使用apply
可以操作MessageEvent里面的属性,然后使用let
再把最后的MessageEvent返回并传给其他的地方使用。it
表示apply
返回的对象(MessageEvent)。一句链式调用使可读性增强。
扩展函数
又一个重磅炸弹,可以让某个类凭空使用并不存在的方法。比如我要隐藏一个view,平时这样写:
view.setVisibility = View.GONE
使用扩展函数以后,先定义一个扩展函数:
fun <T : View> T.gone() {
this.visibility = View.GONE
}
然后就可以对任意的view使用view.gone()
方法了,是不是很简单?
有人说这不就是一个工具类嘛?这样想你就错了。下面来说下为什么他是我眼中的重磅炸弹
自动加默认值,无需重写
如果在工具类中,写一个toast方法,至少需要两个:toast(message,duration) toast(message)
第一个方法其实内部调用了第二个方法并默认给了一个duration(比如
Toast.LENGTH_SHORT
)。 这种地方比比皆是,也是成倍增加了代码量。 但是使用kotlin扩展函数以后,我们这样:fun Context.toast(message: CharSequence, duration: Int = Toast.LENGTH_SHORT){ Toast.makeText(this, message, duration) }
就这一个函数,可以这样使用:
toast("Hello") toast("Hello", Toast.LENGTH_LONG)
两种写法都允许。爽吧
在这里实际上第二个参数是「可选的」,也就是说如果你不填他会给一个默认值。闭包
kotlin是支持闭包的,所以你可以传入一个unit参数。而如果你是要传入一个函数式接口并实现其中的方法时,闭包可以帮你剔除多余的参数而专注于核心参数。比如下面这个扩展函数:fun <T> ListView.setOnItemClickListener(block: (T) -> Unit) { this.setOnItemClickListener { _, _, position, _ -> val item = this.adapter.getItem(position) block(item as T) } }
我们可以使用
listview.setOnItemClickListener<User> { user -> //xxx }
这样在
onItemClick
的方法中,我们只需要关注item这个核心参数,其他的都已经被屏蔽了。
其他
像支持java8的函数式编程、lambda语法、forEach
、map
这样的特性,在这个时代几乎已经是标配了,就不赘述了。
给我个人的感觉是,kotlin作为Google官方支持Android的语言,并没有拿出有竞争力的东西来,他能做的java都能做,虽然兼容java但是还是有一些坑的——比如泛型等。所以无法作为一个能替代java的或者能和java并驾齐驱的东西。
但是考虑到他的背靠大树,以及如此年轻,还是大有发展前景的,不过这都是后话。java的东西还是需要学好的,正常人并不会因为他就抛弃java。