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

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 等。他们之间不能直接相互强制转化,必须调用以下方法进行转换,每个基础类型都带有以下方法:

toByte(): Byte
toShort(): Short
toInt(): Int
toLong(): Long
toFloat(): Float
toDouble(): Double
toChar(): Char

Kotlin 变量和常量声明

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

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) 类声明

[类属性] class A {
    var arg1 = 1; //变量
    val arg2 = 2; //常量
    ...
    
    fun fun1() {
        ...
    }
    ...
}

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

[类属性] class A

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

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关键字,因此,类定义无需使用任何关键字,直接定义类即可,非常的简洁

var a = A(1, 1)

iii) Kotlin 类继承

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

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。完整的方法声明如下(其中[]方括号中的属性不需要时可以省略):

[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:
<?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代码如下:

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文件
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如下:

<?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是这样的

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方法还有更简洁的写法:

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~ 传送门

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容