Kotlin 带你飞


Kotlin 是一种基于 JVM 的编程语言,由 JetBrains 开发,已正式成为 Android 官方开发语言,完全兼容 Java,更安全、更简洁。

版权声明:本文为 frendy 原创文章,可以随意转载,但请务必在明确位置注明出处。


image


优势


官方号称更简洁、更安全、兼容性更好、各种 IDE 或命令行工具都适用。

image

事实上呢,也确实如此,Kotlin 具备许多 Java 没有的特性。来,一起飞:

1. 简洁

为什么可以简洁,因为可以避免大量的模板代码;为什么可以避免,因为大部分典型情况都在语言中默认覆盖实现了。我们来看看下面的例子:

a) Java 实现典型的数据类:

public class User {
    private long id;
    private String name;
    private String addr;
	
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAddr() {
        return addr;
    }
    public void setAddr(String addr) {
        this.addr = addr;
    }
    @Override public String toString() {
        return "User{" +
          "id=" + id +
          ", name='" + name + '\'' +
          ", addr='" + addr + '\'' +
          '}';
    }
}

b) Kotlin 则会简洁很多,只需要定义如下即可,所有属性和它们的访问器都会自动生成,以及一些有用的方法,比如 toString():

data class User(
    var id: Long,
    var name: String,
    var addr: String)
2. 空安全

NullPointerException 是每个 Java 开发者都会遇到的 Bug,怎么修改,加个空判断咯。但是这样的判断加多了其实也烦,代码也不够美观。Kotlin 跟其他现代语言一样,是空安全的,通过一个安全调用操作符(?)来明确地指定一个对象是否能为空。

var str: String = null;  //✘ 直接报错,无法编译通过
var str: String ?= null; //✔ 添加安全调用操作符,明确指定 str 可以为空
3. 更易扩展

Kotlin 可以给任何类添加函数,比如给 Context 添加 toast 函数如下:

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

它可以被任何 Context 或者它的子类调用,比如 Activity 或者 Service,是不是很方便。这里在 Activity 内部可以直接调用如下:

toast("Hello frendy!")
toast("Hello frendy!", Toast.LENGTH_LONG)
4. 支持函数式(Lambda)

Lambda 表达式笔者目前使用的不多,这里以《Kotlin for android developers》书中的 setOnClickListener() 简化之路来介绍吧:

a) Java 实现一个事件点击监听:

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

b) Kotlin 实现如下,暂时看来好像并没有简洁很多是吧:

view.setOnClickListener(object : OnClickListener {
	override fun onClick(v: View) {
		toast("Click")
	}
}

c) Kotlin 允许 Java 库的一些优化,Interface 中包含单个函数可以被替代为一个函数:

fun setOnClickListener(listener: (View) -> Unit)

d) 一个 Lambda 表达式通过参数的形式被定义在箭头的左边(被圆括号包围),然后在箭头的右边返回结果值。在这个例子中,我们接收一个 View,然后返回一个 Unit(没有东西):

view.setOnClickListener({ view -> toast("Click")})

e) 当我们定义了一个方法,我们必须使用大括号包围,然后在箭头的左边指定参数,在箭头的右边返回函数执行的结果。如果左边的参数没有使用到,我们甚至可以省略左边的参数:

view.setOnClickListener({ toast("Click") })

f) 如果这个函数的最后一个参数是一个函数,我们可以把这个函数移动到圆括号外面:

view.setOnClickListener() { toast("Click") }

g) 并且,最后,如果这个函数只有一个参数,我们可以省略这个圆括号:

view.setOnClickListener { toast("Click") }

好吧,现在是不是简洁了很多,逻辑也更直观、更清晰了。


环境配置


了解完 Kotlin 的优势,有木有一股操刀上阵的冲动?先别急,我们一起磨磨刀,配置下开发环境先。

1. 安装 Kotlin 插件

当然 Android Studio 3.0 以上版本是默认自带的,这里笔者用的是 2.3.2 版本,因此需要自己安装,File -> Settings -> Plugins -> 搜索安装 Kotlin,如下图示:

image

2. 新建 Kotlin Activity

image

3. 让 Gradle 自动配置 Kotlin

image

选择 Kotlin 编译器版本:

image

完成后,Gradle 会自动添加以下依赖,如果想自己手动配置,参考下面红框内配置即可:

image

image

4. 配置插件

Kotlin Android Extensions 是 Kotlin 团队研发的插件,包含了 view 的绑定。因此代码中可以不再需要大段大段的 findViewById() 了。

apply plugin: 'kotlin-android-extensions'

image


Hello World


一切就绪,起飞起飞:

import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        tvHello.setText("hello world");
    }
}

image


欢迎来撩

frendy

It will shine for us...