谷歌在2017年的I/O开发者大会上宣布,将Kotlin语言作为Android的一级开发编程语言。Android studio(3.0)也将 提供支持。这个消息一出来,kotlin就火了。看下历史,JetBrains在2010年就推出Kotlin编程语言。kotlin与Java完全互通,这样一来Kotlin可以很好的利用,Java语言建立起来的生态圈。那么我们真的需要学习Koltin吗?首先可以告诉大家Kotlin也是面向JVM的语言,它并灭有提高运行的效率。但是Kotlin具有很多现代语言的特点,代码变得简洁很多,提高了开发的效率。下面介绍下Kotlin开发Android的一些有趣和精彩的地方。只是介绍,不讲语法。
1.告别黄油刀(Butter Knife)
在实际开发安卓App的时候我们首先要定义布局,在布局中我们需要定义我们的控件Button、TextView、ImageView等。定义完布局我们就需要在Activity中去得到这些控件,最原始的方法是通过Activity类自带的findViewById方法。后来我们有了Butter Knife这个库以后,我们可以省去很多重复的模板代码。只需要在我们声明的成员变量上加上注解就可以。当然还需要在onCreate方法中初始化,我们可以把初始化放在BaseActivity中。但是有了kotlin-android-extensions这个插件事情就更简单了,我们只需要配置好这个插件后,在Activity中import这些控件就可以在Activity中直接使用,连变量声明都不需要了。
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.myfirstkotlinapp.ui.MainActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/myList"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
</FrameLayout>
import kotlinx.android.synthetic.main.activity_main.* //这句话就代表引入了所有控件
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 你可以值解使用RecyclerView控件,变量名字和布局中的名字相同
myList.layoutManager = LinearLayoutManager(this)
}
}
2.神奇的扩展方法(Extension functions)
Android的sdk和Java的jdk给我们定义了很多的类,帮助我们更加便捷的开发。但是用我们传统的Java语言,是没有办法为原来的类增加新的方法的。没关系,Kotlin能办到。
package com.example.extensions
import java.text.DateFormat
import java.util.*
fun Long.toDateString(dateFormat: Int = DateFormat.MEDIUM): String {
val df = DateFormat.getDateInstance(dateFormat, Locale.getDefault())
return df.format(this)
}
上面的代码我们为Long这个类增加了一个toDateString的方法,参数是dateFormat,并且还可以定义一个默认值DateFormat.MEDIUM。主要是我们在开发的时候用起来会特别的方便。我们可以直接把一个Long类型的时间戳通过这个方法转换成String类型的字符串
3.高阶函数(Higher-Order Functions )
Kotlin还有一个Java不具备的特性,就是给方法传参数的时候,这个参数也可以是个方法。多么神奇。我们写个方法,就是从一个List种取出偶数,组成一个新的List。
我们用Java写:
public List<Integer> filter(List<Integer> list) {
List<Integer> resultList = new ArrayList<>();
for (int t : list) {
if (t % 2 == 0) {
resultList.add(t);
}
}
return resultList;
}
我们用Kotlin写:
fun filter(items: Collection<Int>, f: (Int) -> Boolean): List<Int> {
val filtered = arrayListOf<Int>()
for (item in filtered) {
if (f(item)) {
filtered.add(item)
}
}
return filtered
}
在Kotlin中,方法的参数类型是在:的后面。(Int) -> Boolean这个是上面方法的第二个参数的参数类型。表示这个参数是个方法并且这个方法的传入的是一个Int类型的值,返回值是Boolean类型的值。那么怎么调用这个上面这个方法呢?
val numbers = listOf<Int>(1, 2, 3, 4)
// 得到所有偶数组成的List
filter(numbers, {
it % 2 == 0
})
在Kotlin中当一个方法的方法参数是最后一个的时候我们还可以写成这样
val numbers = listOf<Int>(1, 2, 3, 4)
// 可以把大挂号放外面
filter(numbers) {
it % 2 == 0
}
如果我们想得到List中的奇数组成的List可以这样,相当简单
val numbers = listOf<Int>(1, 2, 3, 4)
filter(numbers) {
it % 2 == 1 // 奇数
}
从上面的例子我们可以看出方法参数的厉害和简洁了。
4.治愈空指针异常(Null Safety)
在用Java语言开发Android应用的时候有个很麻烦的事情就是空指针异常。为了保证我们的应用不挂掉,我们需要不停的用if语句去判断一个变量是否为空。
String a = null;
System.out.println(a.length());
在Java中上面的代码一定会报空指针异常,应用挂掉。看看在Kotling是怎么处理这个问题的
val a: String? = null
println(a?.length)
上面的代码可以成功的编译,并且在运行的时候不会挂掉,最后打印出null。
5.非常方便的data class
在实际开发的时候,网络请求数据是最常见的。通过http请求服务端返回一串Json数据。我们一般通过Gson这个库,把数据保存到一个Java类中,这个类只做数据的储存,只有setter和getter。老外把这种类叫POJO。在Kotlin中我们可以通过data class来保存数据,相当的简单明了。我们来做个比较
假设我们需要保存一个用户的数据,包括用户的名字、年龄、手机号,看看用Java的实现
public class User {
private String name;
private int age;
private String mobile;
public User(String name, int age, String mobile) {
this.name = name;
this.age = age;
this.mobile = mobile;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
}
看看Kotlin的实现,自动实现equals和hashCode方法,自动实现getter和setter
data class User(val name: String, val age: Int, val mobile: String)
通过上面的比较,Kotlin的实现是实在是简单很多,让人一目了然。
总结
我就说了5点,你是不是心动了。其实Kotlin还有很多有趣的语法。个人觉得,既然kotlin得到了Goole的支持和认可我觉得还是有必要去学习一下。Kotlin作为一门现代语言,学会了其中的精华,对我们学习其他语言也是有帮助的。kotlin很精彩。