此文章主要写了我在学习kotlin的历程中的一些感悟和体会。供入门的同学参考。
一、Kotlin优点
- 1.扩展函数
- 2.可空性(避免空指针)
- 3.代码简洁,可读性强
- 4.高度互操作性(Kotlin与Java混合编程)
- 5.函数式编程
1.扩展函数
我们可以给任何类添加函数,而不需要继承它
例如:给View函数添加扩展函数,控制View的可见性
view的可见性我们一般写成
我们可以通过扩展函数来定义方法
现在我们就能直接通过调用方法来控制视图的可见性
并且,我们在Java中也可以调用在Kotlin中定义的扩展函数。
扩展函数的本质是静态函数,它把调用对象当做它的第一个参数
所以,如果刚刚我们的View扩展函数定义在ViewUtils.kt
文件中
那么,我们在Java
文件中可以这样调用
ViewUtilsKt.visiable(tbCommonRlSync)
2.可空性
可空性是Kotlin类型系统中帮助你避免NullPointException错误的特性。
Kotlin的变量类型包括可空类型和非空类型。可空类型在编译期会检查Null情况
Kotlin中提供多种运算符,帮助我们检查可空类型变量的Null情况
- 安全调用运算符
?.
- Elvis运算符
?:
- 安全转换运算符
as?
- 非空断言
!!
-
let
函数
3.代码简洁,可读性强
例如:创建一个对象
Java中的写法
在kotlin文件中
再例如:我们在定义按钮点击事件时通常的写法是
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关键字:
(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中 代码可以正常执行
在kotlin中代码不能正常执行
Retrofit在执行此方法时,会检查参数的类型。虽然kotlin的Any类似于Java的Object,但是这里的会被编译成通配符?。Retrofit检查到类型为通配符,会报出异常,导致代码不能正确的执行。
这时候我们可以添加@JvmSuppressWildcards
注解
@JvmSuppressWildcards
用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符。这样就可以保证代码正常执行
(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)
编写如图一个登录界面
用Anko Layout DSL来写的话
- 其中
dip
函数是Anko库中将dip
单位的值转为像素单位的一个函数 -
onClick
函数是Anko库中对OnClickListener
接口的一个扩展函数
2.区域列表界面
编写如图一个区域列表界面
用Anko Layout DSL来写的话
Anko Layout DSL优缺点
- 优点:
1.相比于Java代码编写的界面,更加的简洁。所有的组件都是Anko库中定义的扩展函数,lambda表达式作为参数,可读性强
2.相比较与XML文件,这种编写界面的方式更易于扩展,代码易于重用 - 缺点:
1.现阶段的Anko Layout Preview
工具还不太成熟,预览界面不能实时刷新。
2.组件Id
需要自己定义,通过Id
获取组件很麻烦,也没办法与Extension
一起使用
下面看下Extension的使用
3.用Extension来访问XML中的组件
先用XML编写一个Dialog弹窗,如图
XML文件如下
我们在Kotlin文件中,导入该布局
就能直接利用Id访问组件
这样我们就能摆脱大量的findViewById
代码
4.非空性
-
let
函数 保证接收到的参数为空时,不执行任何操作
5.扩展函数
为Activity定义扩展函数,用于添加Fragment
在Activity中可以直接使用addFrg添加Fragment
6.函数式编程
这里将接口返回的List做适当的处理,用asSequence将数组转换成序列的形式
filter
函数主要是从集合中移除不想要的元素
map
函数主要是 对集合中每一个元素应用给定的函数并把结果收集到一个新的集合
apply
函数是把第一个参数转换成第二个参数传给它的lambda
接收者,并返回作为实参传递给它的对象。
最后用toList
函数将序列转换为数组。
总结
- Kotlin编程使我们的代码变得更加简洁,可读性强,便于我们代码的review
- 可空性的处理极大的减少了我们代码中NPE的风险
- 扩展函数的存在,让我们能够方便的扩展API
- kotlin与Java高度的互操作性使我们可以在原有的项目中轻松的使用Kotlin
- Kotlin中大量的库函数,极大的减少了我们的工具类