Kotlin 程序设计iOS|Android.全球编程语言爱好者

一句话解决的事何必说三句,Kotlin入坑指南

2017-05-22  本文已影响2684人  罗拙呓

看到这个标题你可能觉得很奇怪,其实这里指的是Kotlin语言出色的简洁性,能比原有用Java代码实现的功能缩小三倍以上的代码量。不仅如此,这还不是Kotlin最出色的语言特性,不信你接着往下看。

什么是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语言来写的,难不成让我推倒重来过?别急,最后我要说的一个最大的优势就是

简洁性

我们以最基本的POJO为例

public class User {
private long id;
private String name;
public void setId(long id) {
this. id = id;
}
public void setName(String name) {
this. name=name;
}
public long getId() {
return id;
}
public String getName() {
return name;
}
}

其实上述类里就两个字段,一个id一个name,如果拿kotlin来写的话是什么样子呢?

data class User(var name: String, var id: String)

这一句代码就够了,Kotlin会自动生成所有属性和它们的访问器,以及一些方法,例如toString方法及equals方法。

var user = User("kotlin","123")

另外如果不需要参数或者只需要一个参数时

class User {
var name: String? = null
var id: String? = null

constructor(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.name)

例如以上代码,是无法编译通过的,因为user是可能为空的,而user没对空情况做处理,所以无法编译。解决方式有两种:

//第一种对字段进行空情况做处理,则可安全调用
if(user != null){
    toast(user.name)
}
//第二种利用安全调用操作符,只有在user不为空时会调用user.name,否则调用toast(null)
toast (user?.name)

我们也可以给它赋一个默认值,当user为空时调用toast("kotlin")

//Elvis操作符用法
toast(user?.name ?: "kotlin")

易扩展

上述代码有的人会问了,为什么你的toast可以这么写?其实就是kotlin的扩展函数在起作用。

kotlin允许我们对任何类添加方法,包括系统级的类,自定义类等等,比如我想在Context类中添加一个toast方法。
我们新建一个kt文件(kotlin的文件后缀),在里面写上

fun Context.toast(message: CharSequence, duration: Int = Toast.LENGTH_SHORT) { 
    Toast.makeText(this, message, duration).show()
}

加上这句之后,你可以在所有用到context的地方调用context.toast()方法,另外如果扩展方法写到类中,那么仅在该类生效。

这是个很有意思的特性,接下来的事情就是发挥你们的想象力了~

函数式(Lambdas)

举个栗子,我们在Android开发中,经常需要写的点击事件

view.setOnClickListener(new OnClickListener(){
    @Override
    public void onClick(View v) {
        Toast.makeText(v.getContext(), "Click", Toast.LENGTH_SHORT).show();
    }
})

利用了之前提到的扩展函数,可以写成

view.setOnClickListener(object : OnClickListener {
    override fun onClick(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(R.id.textview);
Button button = findViewById(R.id.button);

textView.setText("kotlin");
button.setOnClickListener(...)

或者利用ButterKnife,写如下代码

@Bind(R.id.textview)
TextView mTextView;

@Bind(R.id.button)
Button mButton;

...

mTextView.setText("kotlin");

mButton.setOnClickListener(...)

相信不止我一个人觉得这种代码又重复又无聊,kotlin给我们提供了另外一个思路,直接利用id来绑定

// 导入该Activity对应的布局文件
import kotlinx.android.synthetic.main.activity_main.*

...
    //导入后,整个Activity就可以直接利用id来对View进行操作了
    // Instead of findView(R.id.textView) as TextView
    textView.setText("kotlin")
    // Instead of findView(R.id.button) as Button
    button.setOnClickListener(...)
    }
}

这样处理再也没有一点多余代码,直接利用view的id操作,简洁明了。

导入格式:import kotlinx.android.synthetic.main.<layout>.*

对初学者友好

我们在由一门语言转到另一门语言时难免有所抵触,会考虑新的语言学习成本等等问题。不过对于Kotlin来说,给了掌握Java语言童鞋们转Kotlin很多便利性:

在idea中安装kotlin插件之后,我们可以在Code下找到

总结

本文浅显地总结了下kotlin对比java的几个优势,对于深层次的解析会放在后面的文章,有兴趣的童鞋可以继续关注,毕竟一门语言博大精深也不是一篇文章能讲完的。相信你看到这里内心早就想体验一下kotlin的魅力了,点此开启你的kotlin之旅吧。

参考文献

  1. Kotlin 官方文档
  2. 《Kotlin for android Developers》
上一篇下一篇

猜你喜欢

热点阅读