快速上车Kotlin

presentation by hzwusibo 20180927

kotlin优点:1、可以少些很多代码

2、完全兼容Java

3、Null safe

4、支持lambda表达式(比Java8更好)

5、可扩展函数:这意味着,就算我们没有权限去访问这个类中的代码,我们也可以扩展这个类的更多的特性。

缺点:

1、没有静态修饰语

2、可以显著减少代码的总行数,但它可能也会增加编译后的方法数量。

3、不好断点。


分享主要分4部分:

前言: Kotlin的优势

1、Kotlin在Android中案例学习(新特性 )

2、Java切换Kotlin  小卡片(语法对比,快速入门)

3、Kotlin基础语法学习(demo样例)

4、小结与讨论

补充

参考资料





前言

Kotlin优势:

可以编写少得多的代码。

更安全: Kotlin是空安全的,在编译期就处理了各种null的情况,避免了执行时异常。可以节约调试空指针异常的时间,不用担心 null引发bug。

可扩展函数:这意味着,就算我们没有权限去访问这个类中的代码,我们也可以扩展这个类的更多的特性。

函数式的:Kotlin是基于面向对象的语言。但是就如其他很多现代的语言那样,它使用了很多函数式编程的概念,比如,使用lambda表达式来更方便地解决问题。

高度互操作性的:你可以继续使用所有用Java写的代码和库,甚至可以在一个项目中使用Kotlin和Java两种语言混合编程。一行Java一行Kotlin。

一、Kotlin 用于 Android 的案例学习

1.1  Android Studio 快速上手小工具:

      如果不知道如何在Kotlin中写一个相当简单的Java表达式。  有一个简单的诀窍,就是在AndroidStudio的Java文件中编写一段代码,然后将其粘贴到kt文件中,它会自动转换为Kotlin。

1、直接把Java代码拷贝到.kt文件中,编译器会弹出如下提示:

      Kotlin与Java是100%兼容的,因为它最终会编译成Java字节码,我们可以通过 Android Studio工具看到编译的bytecode:

    我们还可以把编译出来的Java字节码反编译成Java代码。

1.2 Kotlin 用于 Android 的案例学习

Kotlin 已被一些大公司成功采用,其中一些公司分享了他们的经验:

Pinterest 已经成功地将 Kotlin 引入了他们的应用程序中,每个月有 1 亿 5 千万人使用。 Basecamp 的 Android 应用程序

https://www.youtube.com/watch?v=X1RVYt2QKQE

1、 数据类  koltin转Java    copy(val var 不必说明类型、  ==  === )

2、没有set get 变成  属性

3、函数 (可以参数 默认值、  一行的函数  return —>  =  、when )

4、拓展函数

5、null ? !! ?:

6、高阶 函数 (函数作为参数)

7、类继承 (open)

1.3  新特性

3.1、 数据类  (可以编写少得多的代码)

数据类是kotiln的一个语法糖, 编译器会自动为数据类生成一些成员函数

java:

kotlin:

3.2、 所有类型都能 val var表示

所有的对象都通过一个指针所持有,而指针只有两种类型:var 表示指针可变,val表示指针不可变。

Kotlin还引入了字符串模板 $ ,可以在字符串中直接访问变量和使用表达式

3.3 冒号

下面四种场景:

在变量定义中,代表变量的类型

在类定义中,代表基类的类型

在函数定义中,代表函数返回值的类型

在匿名对象中,代表对象的类型

3.4  Lambdas

RxJava现在很火,RxJava在android中的应用:

函数缩写:返回一个单一的的值 (省略大括号, 直接 = )

3.5、 强大的when

Kotlin中没有switch操作符,而是使用when语句来替代。同样的,when 将它的参数和所有的分支条件顺序比较,直到某个分支满足条件。如果其他分支都不满足条件将会进入 else 分支。

但功能上when语句要强大得多。首先第一点是,我们可以用任意表达式(而不只是常量)作为分支条件,这点switch就做不到。

如下述代码,前面三个分支条件分别是:1、变量在[1, 10]区间内, 2、变量x不在[10, 20]区间内,3、变量x是一个字符串。这个表达式用switch语句基本无法实现,只能用if else 链来实现。

if else 链,我们可以直接用when语句把它给替换掉:

3.6 对象比较

Java的 == 操作符是比较引用值,但Kotlin 的 == 操作符是比较内容, === 才是比较引用值。

‘==‘表示比较值 (相当于java equal)  !=

‘===‘表示比较两个对象的地址是否相等(相当于java  == )    !==

基于这点,我们可以写出逻辑更简洁合理的代码:

上述代码可以直接用when语句实现

3.7、扩展方法

这意味着,就算我们没有权限去访问这个类中的代码,我们也可以扩展这个类的更多的特性。

3.7.1  dp, sp, px间的转换

          传统的java写法通常是写个类似Util.dpToPx(int value)这样的方法。看看Kotlin是怎么通过类的拓展来优雅的解决的:

然后就可以这样写了:params.topMargin = 16.dpToPx()

是不是感动到哭

3.7.2  View的动画

每次写Animation都是一个头两个大, 这回我们不看java了,直接上Kotlin代码:

duration还贴心的设了个默认值呢!然后就可以这样写了~yourView.animateTopMargin(16, 32)或者你想把duration设长一点 yourView.animateTopMargin(16, 32, 500)

3.7.3 让Fresco更易用

Fresco是Facebook出品的网络图片加载库,实现了许多在android上非常有用的功能。比如Multi-URI功能可以优先显示低分辨率的图片,等高分辨率的图片下载完成后再进行替换。这个功能在移动设备上太太太有用了,就是写起来有点蛋疼:

怎么使用就不写了,大家都知道了

3.8、更加安全的指针操作

Kotlin是空安全的,在编译期就处理了各种null的情况,避免了执行时异常。可以节约调试空指针异常的时间,不用担心 null引发bug。

?: 表示左侧不为空, 返回左侧  。 b?.length 不为null 返回左侧,否则返回右侧

? 表示变量可为空

3.9 高阶函数(函数作为参数,传入函数)

高阶函数简单的说就是 一个函数作为方法的参数

findEmail 在users中筛选 email符合 传入 predicate函数的user,并返回。

传入函数fit到 findEmail方法 ( 需要在函数名前加两个冒号 :: 作为标记)

附上:

3.10  数据解构

解构就是解除数据结构, 这里的结构就是将数据对象中的属性提取出来

val (id , username, email) = User(1, "WUSIBO" ,"[email protected]")

Log.w("WSB", "username = "+username);

3.11  更简洁的字符串

字符串的所见即所得    ,  三引号”””来方便长篇字符串的书写

3.12 委托 

可观察属性,本质就是观察者模式,在Java中也可以实现这个设计模式,但Kotlin实现观察者模式不需要样板代码。在谈Kotlin的可观察属性前,先看下Kotlin里面的委托。同样的,委托也是一种设计模式,它的结构如下图所示:

Kotlin在语言级别支持它,不需要任何样板代码。Kotlin可以使用by关键字把子类的所有公有成员都委托给指定对象来实现基类的接口:

上述代码中,Base是一个接口,BaseImpl是它的一个实现类,通过by b语句就可以把Derived类中的所有公有成员全部委托给b对象来实现。我们在创建Derived类时,在构造器中直接传入一个BaseImpl的实例,那么调用Derived的方法等同于调用BaseImpl的实例的方法,访问Derived的属性也等同于访问BaseImpl的实例的属性。

回到可观察属性这个概念,Kotlin通过 Delegates.observable()实现可观察属性:

上述代码中,name是一个属性,改变它的值都会自动回调{ prop,  old,  new -> }这个lambda表达式。简单来说,我们可以监听name这个属性的变化。

可观察属性有什么用处呢?ListView中有一个经典的Crash:在数据长度与Adapter中的Cell的长度不一致时,会报IllegalStateException异常。这个异常的根本原因是修改了数据之后,没有调用notifyDataSetChanged,导致ListView没有及时刷新。如果我们把数据做成可观察属性,在观察回调方法中直接刷新ListView,可以杜绝这个问题。

二、小卡片 (From Java to Kotlin )

2.1 常量与变量

2.2 null声明

2.3 空判断

2.4 字符串拼接

2.5 换行

2.6 三元表达式

2.7 操作符

2.8 类型判断和转换 (声明式)

2.9 类型判断和转换 (隐式)

2.10 if 多重条件

2.11 case语句

2.12 for循环

2.13 集合操作

2.14 遍历

2.19 方法定义

2.20 带返回值的方法

2.21 无结束符号

2.22  工具类

2. 23 Get Set

2.24 类扩展方法

其他 :

快速上手 Kotlin 的 11 招  : https://mp.weixin.qq.com/s/lDBSi2E5_u8dJg21wubH4Q?utm_source=androidweekly.io&utm_medium=website

三、Koltin基础语法    demo

koltin 样例

1、koltin 基础知识

2、类与接口

3、数据类

4、泛型

5、 koltin 高阶函数与Lambda表达式

6、其他

7、委托

git: https://g.hz.netease.com/WM-Android/WM-Android-Demo/koltinDemo

快速查找: 可以见目录 

四、小结

Kotlin 非常适合开发 Android 应用程序,将现代语言的所有优势带入 Android 平台而不会引入 任何新的限制:

兼容性:Kotlin 与 java 完全兼容,保障了 Kotlin 应用程序可以在较旧的 Android 设备 上运行而无任何问题。Kotlin 工具在 Android Studio 中会完全支持,并且兼容 Android 构 建系统。

性能:由于非常相似的字节码结构,Kotlin 应用程序的运行速度与 Java 类似。 随着 Kotlin 对内联函数的支持,使用 lambda 表达式的代码通常比用 Java 写的代码运行得更 快。

互操作性:Kotlin 可与 Java 进行 100% 的互操作,允许在 Kotlin 应用程序中使用所有现 有的 Android 库 。这包括注解处理,所以数据绑定和 Dagger 也是一样。

占用:Kotlin 具有非常紧凑的运行时库,可以通过使用 ProGuard 进一步减少。 在实际 应用程序中,Kotlin 运行时只增加几百个方法以及 .apk 文件不到 100K 大小。 编译时长:Kotlin 支持高效的增量编译,所以对于清理构建会有额外的开销,增量构建通 常与 Java 一样快或者更快。

学习曲线:对于 Java 开发人员,Kotlin 入门很容易。包含在 Kotlin 插件中的自动 Java 到 Kotlin 的转换器有助于迈出第一步。Kotlin 心印 通过一系列互动练习提供了语言主要 功能的指南。

五、讨论

17 位谷歌 Android 开发专家是如何看待 Kotlin 的?

https://mp.weixin.qq.com/s/T7GZCuauE3Y0dAbZd_oLPw

补充:

1、Android studio3.0 kotlin执行main方法错误

https://blog.csdn.net/yangzongbin/article/details/78394621

2、是 100% Kotlin 代码,他们报告了程序员幸福的巨大差 异,以及工作质量和速度的巨大改善。

https://m.signalvnoise.com/how-we-made-basecamp-3s-android-app-100-kotlin-35e4e1c0ef12

3、Keepsafe 的 App Lock 应用程序也已转换为 100% Kotlin, 使源代码行数减少 30%、方 法数减少 10%。

https://medium.com/keepsafe-engineering/lessons-from-converting-an-app-to-100-kotlin-68984a05dcb6

参考资料:

1、from-java-to-kotlin    https://github.com/MindorksOpenSource/from-java-to-kotlin/blob/master/README-ZH.md

2、Kotlin在Android中的应用  http://qq157755587.github.io/2015/11/14/kotlin-in-android/?utm_source=androidweekly.io&utm_medium=website

3、Kotlin —— 这次入门就不用放弃了  https://www.jianshu.com/p/f364e3f9cc36

4、Kotlin超棒的语言特性 https://mp.weixin.qq.com/s/ylAZnOObrwtJDPqaK2ONLw

5、Kotlin —— 这次入门就不用放弃了https://www.jianshu.com/p/f364e3f9cc36

你可能感兴趣的:(快速上车Kotlin)