什么是Kotlin?
Kotlin是JetBrains开发的基于JVM的语言。JetBrains是一家捷克的软件开发公司,该公司位于捷克的布拉格,研发了IntelliJ IDEA这款相对于Eclipse有较大改善的大名鼎鼎IDE产品,使用Java开发的童鞋想必也是非常了解了,还有一些其他类似产品比如,Pycharm,Clion等等,我就不打广告了[捂脸]
而Android Studio这款官方的Android开发IDE也是基于IntelliJ开发出来的。而在今年的Google I/O大会上,Google官方承认了Kotlin作为Android开发的官方语言,所以说JetBrains与Google想必是有什么不可告人的秘密,咳咳。
我们为什么要学Kotlin?
下面来讲一下Kotlin和Java相比的优势是什么?
- 更简洁:这是它重要的优点之一,可以比Java编写少得多的代码。
- 更安全:Kotlin是空安全的,它在编译期间就会处理各种为null的情况,无需像java一样添加很多的判空代码,节约很多调试空指针异常的时间,很大程度上避免出现NullPointException。
- 易扩展:扩展函数意味着我们不仅可以扩展我们原有写好的类,还可以扩展系统级的类,非常灵活,另外如果在类里编写扩展函数,那么只对当前类生效。
- 函数式:Kotlin使用了很多函数式编程的概念,比如用到了lambda表达式来更方便地解决问题。
- Kotlin Android Extensions:再也不用编写烦人的findViewById()了,如果你集成了ButterKnife,是时候删除对它的依赖了,Kotlin支持了对于View以id形式访问。
- 不用写分号,就像你看到的上述代码一样,对于很多写过脚本语言的童鞋来说,不要写分号这一点真是节省了很多时间,对于一天写几百行几千行甚至上万行代码的童鞋们来说,相当于省了多少个分号.
到这里有的同学想要说了,你说的这些好处确实不错,但是我之前的项目全是用java语言来写的,难不成让我推倒重来过?别急,最后我要说的一个最大的优势就是
- 与Java语言可混合编程,也就是说我们可以继续使用原来所有用Java写的代码和库,因为两个语言之间高度互操作,想尝试的童鞋们建议可以从新的小功能小模块入手,对这些模块使用Kotlin代码进行编写,原有的稳定模块之后再逐步重构。
- 对初学者友好,kotlin对java语言转用kotlin提供了很多便利,对于初学者来说免去很多不必要的烦恼。最贴心的是Kotlin插件支持一键由Java转Kotlin,为你之后想要重构提供了很大的便利性。
简洁性
我们以最基本的POJO为例
publicclassUser{
privatelong id;
private String name;
publicvoidsetId(long id){
this. id = id;
}
publicvoidsetName(String name){
this. name=name;
}
publiclonggetId(){
return id;
}
public String getName(){
return name;
}
}
其实上述类里就两个字段,一个id一个name,如果拿kotlin来写的话是什么样子呢?
dataclassUser(var name: String, var id: String)
这一句代码就够了,Kotlin会自动生成所有属性和它们的访问器,以及一些方法,例如toString方法及equals方法。
var user= User("kotlin","123")
另外如果不需要参数或者只需要一个参数时
class User {
var name: String? = nullvar id: String? = nullconstructor(name: String) {
this.name = name
}
constructor(name: String, id: String) {
this.name = name
this.id = id
}
}
空安全
可能有的童鞋会问了,?= 是个shenmegui??
当我们用Java写代码时,我们如果不想出现NullPointerException,我们需要在使用它之前每次去判断是否为空。而Kotlin这类空安全语言默认对象和字段不能为空,如果我们非要让一个字段或对象为空那么必须使用安全调用操作符(?)来指定。
val user: User? = null
toast()
例如以上代码,是无法编译通过的,因为user是可能为空的,而user没对空情况做处理,所以无法编译。解决方式有两种:
if{
toast
}
//第二种利用安全调用操作符,只有在user不为空时会调用user.name,否则调用toast(null)
toast (user?.name)
我们也可以给它赋一个默认值,当user为空时调用toast("kotlin")
toast(user?.name ?: "kotlin")
易扩展
上述代码有的人会问了,为什么你的toast可以这么写?其实就是kotlin的扩展函数在起作用。
kotlin允许我们对任何类添加方法,包括系统级的类,自定义类等等,比如我想在Context类中添加一个toast方法。 我们新建一个kt文件(kotlin的文件后缀),在里面写上
fun Context.toast(message: CharSequence, duration: Int = ) {
(this, message, duration).show()
}
加上这句之后,你可以在所有用到context的地方调用()
方法,另外如果扩展方法写到类中,那么仅在该类生效。
这是个很有意思的特性,接下来的事情就是发挥你们的想象力了~
函数式(Lambdas)
举个栗子,我们在Android开发中,经常需要写的点击事件
(new OnClickListener(){
@OverridepublicvoidonClick(View v){
((), "Click", ).show();
}
})
利用了之前提到的扩展函数,可以写成
(object : OnClickListener {
overridefunonClick(v: View) {
toast("Click")
}
}
利用lambdas表达式我们可以把上述代码优化
view.setOnClickListener({view -> toast("Click")}}
很多情况下我们并不需要用到参数View,所以左值参数也可以省略
view.setOnClickListener({toast("Click")}}
由于这个方法只有一个参数,我们可以省略这个圆括号:
view.setOnClickListener{toast("Click")}
比原来的java代码简短了5倍,并且也很容易理解。
Kotlin Android Extention
举个栗子,在Android中我们不可避免地要写以下这种代码
TextView textView = findViewById()Button button = findViewById(R.id.button);
("kotlin")(...)
或者利用ButterKnife,写如下代码
@Bind(R.id.textview)
TextView mTextView;
@Bind(R.id.button)
Button mButton;
...
mTextView.setText("kotlin");
mButton.setOnClickListener(...)
相信不止我一个人觉得这种代码又重复又无聊,kotlin给我们提供了另外一个思路,直接利用id来绑定
import kotlinx.android.synthetic.main.activity_main.*
...
("kotlin")
(...)
}
}
这样处理再也没有一点多余代码,直接利用view的id操作,简洁明了。
导入格式:import kotlinx.android.synthetic.main..*
对初学者友好
我们在由一门语言转到另一门语言时难免有所抵触,会考虑新的语言学习成本等等问题。不过对于Kotlin来说,给了掌握Java语言童鞋们转Kotlin很多便利性:
- 在java中编写一段代码,粘贴到kotlin文件中,IDE利用黑科技将粘贴的java代码自动转换成kotlin。
- 对于之前已经编写好的java类,我们重构不知何从下手时,kotlin提供一键转换功能
在idea中安装kotlin插件之后,我们可以在Code下找到