Kotlin 程序设计禅与计算机程序设计艺术我爱编程

Kotlin入门指南

2017-11-16  本文已影响121人  cy_why

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

一、Kotlin优点

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情况

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.技术背景

书籍

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
功能简介

1.登录界面(Anko layout dsl)

编写如图一个登录界面

image.png

用Anko Layout DSL来写的话

image.png

2.区域列表界面

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

image.png

用Anko Layout DSL来写的话

image.png

Anko Layout DSL优缺点

下面看下Extension的使用

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

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

image.png

XML文件如下

image.png

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

image.png

就能直接利用Id访问组件

image.png

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

4.非空性

image.png

5.扩展函数

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

image.png

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

image.png

6.函数式编程

image.png

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

总结

上一篇 下一篇

猜你喜欢

热点阅读