为什么要学习Kotlin

谷歌在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很精彩。

Kotlin简明学习—文章列表

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值