Kotlin入门指南

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

一、Kotlin优点

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

1.扩展函数

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

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

view的可见性我们一般写成

image.png

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

Kotlin入门指南_第1张图片
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中的写法

Kotlin入门指南_第2张图片
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)

编写如图一个登录界面

Kotlin入门指南_第3张图片
image.png

用Anko Layout DSL来写的话

Kotlin入门指南_第4张图片
image.png
  • 其中dip函数是Anko库中将dip单位的值转为像素单位的一个函数
  • onClick函数是Anko库中对OnClickListener接口的一个扩展函数

2.区域列表界面

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

Kotlin入门指南_第5张图片
image.png

用Anko Layout DSL来写的话

Kotlin入门指南_第6张图片
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弹窗,如图

Kotlin入门指南_第7张图片
image.png

XML文件如下

Kotlin入门指南_第8张图片
image.png

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

image.png

就能直接利用Id访问组件

image.png

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

4.非空性

Kotlin入门指南_第9张图片
image.png
  • let函数 保证接收到的参数为空时,不执行任何操作

5.扩展函数

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

Kotlin入门指南_第10张图片
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中大量的库函数,极大的减少了我们的工具类

你可能感兴趣的:(Kotlin入门指南)