Kotlin入门指南

此文章主要写了我在学习kotlin的历程中的一些感悟和体会。供入门的同学参考。

一、Kotlin优点

  • 1.扩展函数
  • 2.可空性(避免空指针)
  • 3.代码简洁,可读性强
  • 4.高度互操作性(Kotlin与Java混合编程)
  • 5.函数式编程

1.扩展函数

我们可以给任何类添加函数,而不需要继承它

例如:给View函数添加扩展函数,控制View的可见性

view的可见性我们一般写成

image.png

我们可以通过扩展函数来定义方法

image.png

现在我们就能直接通过调用方法来控制视图的可见性

image.png

并且,我们在Java中也可以调用在Kotlin中定义的扩展函数。
扩展函数的本质是静态函数,它把调用对象当做它的第一个参数
所以,如果刚刚我们的View扩展函数定义在ViewUtils.kt文件中
那么,我们在Java文件中可以这样调用

ViewUtilsKt.visiable(tbCommonRlSync)

2.可空性

可空性是Kotlin类型系统中帮助你避免NullPointException错误的特性。
Kotlin的变量类型包括可空类型和非空类型。可空类型在编译期会检查Null情况
Kotlin中提供多种运算符,帮助我们检查可空类型变量的Null情况

  • 安全调用运算符?.
  • Elvis运算符?:
  • 安全转换运算符as?
  • 非空断言!!
  • let函数

3.代码简洁,可读性强

例如:创建一个对象
Java中的写法

image.png

在kotlin文件中

image.png

再例如:我们在定义按钮点击事件时通常的写法是

Button button = (Button)findViewById(R.id.button)  
    button.setOnClickListener(new View.OnClickListener() {  
       @Override public void onClick(View v) {  
            Toast.makeText(this,”Click The Button",Toast.LENGTH_SHORT);  
     } 
 });  

而利用Kotlin+Extension+Anko可以简化为

button.onClick{
       toast(“Click The Button”);
}

4.与Java的互操作性

Kotlin与Java能够进行混合编程,在原有Java项目中使用Kotlin编程时,不需要将整个项目都转成Kotlin。

(1)属性读写
Kotlin可以自动识别Java中的getter/setter;在Java中可以过getter/setter操作Kotlin的属性。

(2)关键字调用
Kotlin中定义的一些关键字是Java中没有的,如果Java中使用这些关键字作为方法名,那么在Kotlin中调用时,要加入转义字符。如is关键字:

image.png

(3)平台类型
Java 中的任何引用都可能是null,这使得 Kotlin 对来自 Java 的对象要求严格空安全是不现实的。 Java 声明的类型在 Kotlin 中会被特别对待并称为平台类型。对这种类型的空检查会放宽, 因此它们的安全保证与在 Java 中相同。
当我们调用平台类型变量的方法时,Kotlin 不会在编译时报告可空性错误, 但在运行时调用可能会失败,因为空指针异常或者 Kotlin 生成的阻止空值传播的断言:
平台类型表示法
用助记符!来表示平台类型,如:T!表示T 或者T?

(4)可变参数
Kotlin调用Java中含有可变参数的函数时,可以用展开运算符*
例如:在Java中定义方法

public void removeIndicesVarArg(int... indices)

在kotlin中调用就要用到展开运算符

javaObj.removeIndicesVarArg(*array) 

5.函数式编程

Kotlin支持面向对象和函数式两种编程风格。
函数式编程的核心是

  • 头等函数——把函数当作值来使用,可以用变量来保存它,把它当作参数传递,或者当作其他函数的返回值。
  • 不可变性——使用不可变对象,保证他们的状态在创建之后不能再变化
  • 无副作用——使用的是纯函数。此函数在输入相同时会产生同样的结果,并且不会修改其他对象的状态,也不会与外面的世界交互。

二、学习历程

1.技术背景

书籍

  • kotlin in action(1-2周)
    主要讲解Kotlin的入门基础,推荐指数五颗星
  • kotlin-for-android-developers-zh(2天)
    主要讲解kotlin的实践,对基础知识没有过多的讲解,推荐指数四颗星
  • kotlin崛起:次世代Android开发(1天)
    主要看的是Anko Layout DSL部分,推荐指数三颗星
  • kotlin-reference-chinese (http://www.kotlincn.net/docs/reference/) (1天)
    kotlin的官方文档,主要看的是java与kotlin的互操作性,推荐指数五颗星

2.遇到过的问题

(1) kotlin中使用Retrofit的通配符问题
Retrofit请求的时候,要先定义一个接口
在Java中 代码可以正常执行

image.png

在kotlin中代码不能正常执行

image.png

Retrofit在执行此方法时,会检查参数的类型。虽然kotlin的Any类似于Java的Object,但是这里的会被编译成通配符?。Retrofit检查到类型为通配符,会报出异常,导致代码不能正确的执行。

这时候我们可以添加@JvmSuppressWildcards注解
@JvmSuppressWildcards用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符。这样就可以保证代码正常执行

image.png

(2)数据库框架GreenDao,需要在实体类中添加注解生成对应的Dao类
但是这个框架并不支持Kotlin的实体类,所以在使用的时候,我们还是要将需要保存到数据库的实体,以Java类的形式编写。

(3)java调用Kotlin代码时,可能会传入一个空的变量,由于是平台类型的变量在编译的时候并不会报错,但是在运行期间会直接奔溃。故我们在使用平台类型的时候,要谨慎使用。

(4)kotlin与Databinding一起使用的话
需要在Gradle文件中添加如下配置

kapt {
    generateStubs = true
}
dependencies {
    kapt 'com.android.databinding:compiler:3.0.0'
}

三、Kotlin实践

利用kotlin来编写一个小demo
功能简介

  • 利用kotlin来编写一个小Demo,实现简单的登录功能和地区信息的增删查改
  • 利用Anko Layout DSL来替代XML文件编写界面
  • 使用Extension来访问组件
  • 使用扩展函数作为工具类
  • rxJava+Retrofit作为网络框架,GreenDao作为数据库操作框架

1.登录界面(Anko layout dsl)

编写如图一个登录界面

image.png

用Anko Layout DSL来写的话

image.png
  • 其中dip函数是Anko库中将dip单位的值转为像素单位的一个函数
  • onClick函数是Anko库中对OnClickListener接口的一个扩展函数

2.区域列表界面

编写如图一个区域列表界面

image.png

用Anko Layout DSL来写的话

image.png

Anko Layout DSL优缺点

  • 优点:
    1.相比于Java代码编写的界面,更加的简洁。所有的组件都是Anko库中定义的扩展函数,lambda表达式作为参数,可读性强
    2.相比较与XML文件,这种编写界面的方式更易于扩展,代码易于重用
  • 缺点:
    1.现阶段的Anko Layout Preview工具还不太成熟,预览界面不能实时刷新。
    2.组件Id需要自己定义,通过Id获取组件很麻烦,也没办法与Extension一起使用

下面看下Extension的使用

3.用Extension来访问XML中的组件

先用XML编写一个Dialog弹窗,如图

image.png

XML文件如下

image.png

我们在Kotlin文件中,导入该布局

image.png

就能直接利用Id访问组件

image.png

这样我们就能摆脱大量的findViewById代码

4.非空性

image.png
  • let函数 保证接收到的参数为空时,不执行任何操作

5.扩展函数

为Activity定义扩展函数,用于添加Fragment

image.png

在Activity中可以直接使用addFrg添加Fragment

image.png

6.函数式编程

image.png

这里将接口返回的List做适当的处理,用asSequence将数组转换成序列的形式
filter函数主要是从集合中移除不想要的元素
map函数主要是 对集合中每一个元素应用给定的函数并把结果收集到一个新的集合
apply函数是把第一个参数转换成第二个参数传给它的lambda接收者,并返回作为实参传递给它的对象。
最后用toList函数将序列转换为数组。

总结

  • Kotlin编程使我们的代码变得更加简洁,可读性强,便于我们代码的review
  • 可空性的处理极大的减少了我们代码中NPE的风险
  • 扩展函数的存在,让我们能够方便的扩展API
  • kotlin与Java高度的互操作性使我们可以在原有的项目中轻松的使用Kotlin
  • Kotlin中大量的库函数,极大的减少了我们的工具类
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容