【Kotlin Android】一个列表带你领略Kotlin简洁之风

2020-04-01 17:52:31 浏览数 (1)

Android Kotlin

自从Google宣布Kotlin为Android官方开发语言以来,越来越多的应用都开始使用Kotlin进行开发,包括Google自家开发的许多APP,也不乏许多的大公司的APP。Kotlin的热度也是一路高歌,可以看出这门新兴的语言有多受大家的追捧。

作为一个曾经使用C、C 作为主要开发语言的人,在刚开始接触到Java从事Android开发时,对于Java的简便易学、自动内存垃圾回收机制等等,简直就像发现了一个新大陆一样无比惊喜,大大提升了开发效率。

Java作为一门最受欢迎的编程语言,有其无法比拟的优越性,但同时在如今日益推崇的函数式编程思想上,Java的脚步却显得没有那么与时俱进了,直到最近刚刚推出的Java8才开始支持lambda函数式编程。而Kotlin作为一门函数式编程语言,在这方面是走在了前列的。

当然每门语言都有一个从排斥,到接触,到喜爱或者放弃的过程。我对于Kotlin一开始也是没有多大的兴趣,对函数式编程也是有一定排斥的,总感觉代码可读性和可维护性似乎大大下降,事实上只是对这中编程思想没有一个很好的转变而已。

当我真正学习和使用它的时候,我发现我已经爱上了这门编程语言。要我总结它,那就简洁,无与伦比的简洁。

说了这么多废话,接下来我们就来看看使用Kotlin究竟能带给我们怎样的方便。

Kotlin基本语法

Kotlin 基本数据类型

Kotlin 的基本数值类型包括 Byte、Short、Int、Long、Float、Double 等。他们之间不能直接相互强制转化,必须调用以下方法进行转换,每个基础类型都带有以下方法:

代码语言:javascript复制
toByte(): Byte
toShort(): Short
toInt(): Int
toLong(): Long
toFloat(): Float
toDouble(): Double
toChar(): Char
Kotlin 变量和常量声明

Kotlin使用 varval 关键字作为变量和常量声明,有以下几种声明方式:

代码语言:javascript复制
var 变量名: 变量类型 = 类名()   或
var 变量名: 类名()            或
var 变量名: 变量类型? = null  或
lateinit var 变量名: 变量类型
如:
var value: Int = 1 或
var value = 1 或
var value: Int? = null
lateinit var value: A  //A为非基础类型的类

第一种方式,最完整的声明方式;

第二种方式,省略变量类型声明,直接赋值,因为Kotlin带有自动推断变量类型的功能;

第三种方式,如果你不想声明变量的同时初始化变量,那么可以使用“?”来表明这个变量有可能为null,并赋值为null;

第四种方式,如果你只想声明变量,那么可以使用lateinit关键来表明该变量在后面才进行初始化(注:基础类变量不能指定为lateinit,并且lateinit只能应用在var类型)。

Kotlin 类声明、定义、继承

Kotlin同样使用class来声明类,类继承符号为一个冒号“:”,基类需要在类名后面带上一对括号,如果基类构造函数带有参数,此时需要在括号中填写对应的参数。

i) 类声明

代码语言:javascript复制
[类属性] class A {
    var arg1 = 1; //变量
    val arg2 = 2; //常量
    ...
    
    fun fun1() {
        ...
    }
    ...
}

如果类没有具体内部变量和方法,那么也可定义为一个空类,不需要类名后面的类体

代码语言:javascript复制
[类属性] class A

Kotlin的类默认带有一个无参数的构造函数,默认可以省略不写,如果类的构造函数带有参数,那么可你直接写在默认的构造函数上,或者另外写一个二级构造函数

代码语言:javascript复制
class A(var arg1: Int, val arg2: String) 

或

class A {
    var arg1: Int = 0
    var arg2: Int? = null
    constructor(arg1: Int, arg2: Int) {
        this.arg1 = arg1
        this.arg2 = arg2
    }
}

ii) Kotlin 类定义

Kotlin没有new关键字,因此,类定义无需使用任何关键字,直接定义类即可,非常的简洁

代码语言:javascript复制
var a = A(1, 1)

iii) Kotlin 类继承

Kotlin 继承的关键符号为冒号 “:” ,基类必须为 open/abstrct 属性的class,或者为 interface 接口类,举个栗子:

代码语言:javascript复制
open class Base (arg: Int) {
    var arg: Int? = null
    init {
        this.arg = arg
    }
}

class A(arg: Int): Base(arg) {
    
}

或

class A: Base {
    constructor(arg: Int): super(arg) {
        
    }
}

1,基类Base为open属性的类,并且构造函数需要一个Int类型的参数 2,基类Base中有一个init初始化代码块,可以在里面直接使用构造函数中的参数来完成数据的初始化 3,子类必须在默认的构造方法中初始化基类的参数 4,构造函数名字为constructor,而非像Java用的是类名

Kotlin 函数定义

Kotlin函数方法使用关键字 fun 来声明,关键字 override 表示该函数重写了父类的方法,参数声明使用[参数: 参数类型]的方式类声明,如果参数类型后面带上“?”表示该参数可能为null。完整的方法声明如下(其中[]方括号中的属性不需要时可以省略):

代码语言:javascript复制
[open] [函数属性] [override] fun 函数名(参数: 参数类型)[: 返回值类型] {

}
如:
open protected fun fun1(arg1: Int) : Int {
    return arg1 1
}

Kotlin函数默认函数属性为public,其可见属性与Java基本一致,包括public/private/protected等,并且默认不可改写,与Java的final一样,如果函数需要被子类改写,则需要加上 open 关键字。

有了以上基本了解后,我们就可以开始动手来搭建一个简单的页面,在动手过程中来进一步深入学习。

Kotlin基本使用

新建支持Kotlin的Android工程

如果你的Android Studio还不是3.0,那么需要下载Kotlin的插件和做一些相关的配置,请自行百度。我们直接使用Android Studio3.0新建工程

新建工程

只要勾选左下方的Include Kotlin support即可,然后一路Next,与正常的新建工程无异。接下来就可以愉快的使用Kotlin玩耍啦,此处我们以一个列表页面来演示。

1. 首先,在activity_main.xml中,我们添加一个列表,id命名为listView:
代码语言:javascript复制
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.kotlin_demo.MainActivity">
    <android.support.v7.widget.RecyclerView
        android:id="@ id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

MainActivity.kt代码如下:

代码语言:javascript复制
class MainActivity : AppCompatActivity() {

    private var adapter: SimpleAdapter? = null

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

    private fun initList() {
        listView.layoutManager = LinearLayoutManager(this)
        adapter = SimpleAdapter()
        listView.adapter = adapter
    }

}

还记得让人讨厌的findViewById吗?还记得代码中大量的setter和getter吗?在Kotlin的世界里,这些通通被抹杀在摇篮里。

在xml中声明好的id可以直接在Activity中使用,如上面的listView,无需在代码中再次去声明和定义,Kotlin会自动帮你映射。

在Java中,如果想要配置LayoutManager,需要调用listView的setLayoutManager()方法,在Kotlin中,我们只需直接将LayoutManager赋值给layoutManager即可,没有冗余的setter代码,获取LayoutManager也是一样的,直接使用listView.layoutManager。

通过以上可以看出来,Kotlin无与伦比的简洁之处,当然其还有更强大的,更简洁的地方,我们继续来看看。

2. 接下来,新建SimplerAdapter类,通过右键->New->Kotlin File/Class,即可新建一个kotlin文件
代码语言:javascript复制
class SimpleAdapter: RecyclerView.Adapter<SimpleAdapter.ViewHolder>() {
    override fun getItemCount(): Int {
        return 10
    }

    override fun onBindViewHolder(holder: ViewHolder?, position: Int) {
        holder?.itemView?.text?.text = position.toString()
    }

    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder {
        var view = LayoutInflater.from(parent?.context).inflate(R.layout.item_view, parent, false)
        return ViewHolder(view)
    }

    class ViewHolder(view: View): RecyclerView.ViewHolder(view)
}

item_view.xml如下:

代码语言:javascript复制
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <TextView
        android:id="@ id/text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

看到了吧,一个简单的适配器其几行代码就搞定了。如果在Java中定义一个ViewHold是这样的

代码语言:javascript复制
class ViewHolder extender Recycler.ViewHolder {
    public Textview text, ...;
    ...
    
    public ViewHoler(View itemView) {
        super(itemView);
        text = (Textview)itemView.findViewById(R.id.text);
        ...
    }
}

而Kotlin只需一行代码,同样不需要我们再去查找TextView控件,只需调用holder.itemView.text即可。

并且在以上SimpleAdapter的getItemCount方法还有更简洁的写法:

代码语言:javascript复制
override fun getItemCount(): Int = 10

甚至写成:

override fun getItemCount() = 10

即Kotlin的表达式作为函数体,甚至可以省略返回类型,Kotlin自动推断返回类型

3. Kotlin NULL检查机制

我们看到在上面的代码中,常常出现[变量?.成员变量]的表达形式,即变量后面会带有一个问号“?”,这是什么东东呢?

在Java中经常出现让人头痛的问题就是,如果不加null判断,常常会出现空指针异常,而在Kotlin中,必须对可能为空的变量进行显式的声明,即

i)在变量后面加上“?”来表示该变量可能为空,如果变量真的为null时,会跳过不执行。 ii)如果想和Java一样,在变量为null时,抛出空指针异常,那么可以在变量后加上“!!”双感叹号,对变量进行声明,即该变量一定不为空。

最后

以上,简单介绍了Kotlin的一些最基础的语法,以及用了一个列表展示的例子初步了解和学习了Kotlin在开发中会使用到的一些最基础的知识以及可能产生疑惑的地方,也向大家展示了Kotlin如帮组我们精简代码,提高编码效率。

当然Kotlin还有更多的知识和更多使代码更简洁的技巧,如lambda表达式,对象表达式,函数扩展和对象委托等更高级的功能,这里就不在介绍。

推荐两个学习的网址: 菜鸟教程 Kotlin语言中文站 非常详细全面的介绍了Kotlin的语法和使用。

以上例子代码非常简单就不提供了,这里提供本人自己刚开始正在写的仿【一个】的工程,整个工程使用Kotlin编写,使用MVP模式开发,网络采用RxJava Retrofit OKHttp的框架,现在还很粗糙,正在逐步完善。 bibibi~ 传送门

0 人点赞