
在2019年Google I/O大会上Google 宣布今后将优先采用 Kotlin 进行 Android 开发。一简介Kotlin 是一种富有表现力且简洁的编程语言不仅可以减少常见代码错误还可以轻松集成到现有应用中。Google 列举的 Kotlin 的优势富有表现力且简洁可以使用更少的代码实现更多的功能。表达自己的想法少编写样板代码。更安全的代码Kotlin 有许多语言功能可帮助你避免null指针异常等常见编程错误。可互操作可以在 Kotlin 代码中调用 Java 代码或者在 Java 代码中调用 Kotlin 代码。Kotlin 可完全与 Java 编程语言互操作。结构化并发Kotlin 协程让异步代码像阻塞代码一样易于使用。协程可大幅简化后台任务管理。更重要的是Jetpack Compose 仅支持 Kotlin而不再支持 Java。 Google 提到多平台项目可使用 Kotlin 来开发。二概念介绍1. 包的定义和使用包的定义应该写在文件的顶部。packagecom.rustfisher.ktpractice.introimportkotlin.text.*// ...Kotlin并不要求包名和文件存放位置严格对应。2. 程序入口Kotlin应用的程序入口是main方法。funmain(){// ..}另一个main方法带有参数funmain(args:ArrayString){// ...}3. 标准输出print方法将传入的变量打印到标准输入流。print(Rust )print(Fisher)println打印传入变量并且在最后添加一个换行。println(an.rustfisher.com)println(42)4. 方法下面是一个接受2个Int参数返回Int的方法。funsum(a:Int,b:Int):Int{returnab}方法主体可以是一个表达式。它的返回值可以被推断出来。funsum(a:Int,b:Int)ab方法可以没有返回值或者说是返回一个无意义的值(Unit)。funprintSum(a:Int,b:Int):Unit{println(sum of $a and $b is ${a b})}Unit可以忽略不写。funprintSum(a:Int,b:Int){println(sum of $a and $b is ${a b})}5. 变量只能读的变量需要用关键字val。它们只能被赋值1次。val a:Int1// 直接赋值val b2// 自动推测出是Int类型val c:Int// 当没有赋初始值时需要声明类型Type required when no initializer is providedc3// 这里是推迟赋值可以多次赋值的变量用关键字varvarx5// 自动推测出是Int型x1可以在顶部声明变量valPI3.14varx0funincrementX(){x1}6. 创建类与实例定义一个类使用class关键字classFisher类的属性可以放在定义中或者类里。比如下面这个类Rectangle描述长方形。classRectangle(varheight:Double,varlength:Double){varperimeter(heightlength)*2}默认构造器中的变量可以直接使用。这里可以直接使用面积变量perimeterval rectangleRectangle(5.0,2.0)println(The perimeter is ${rectangle.perimeter})对于kotlin v.1.4.30类的继承用冒号:来表示。类默认都是final的不可继承。为了继承用open让这个类能被继承。openclassShapeclassRectangle(varheight:Double,varlength:Double):Shape{varperimeter(heightlength)*2}7. 注释和其他现代编程语言类似用//或者/**/来注释// 这里是注释 RustFisher/** * 这是注释 *//* 这也是注释 */8. 字符串模版(String tempplates)直接使用变量用$要使用表达式需要用大括号${}vara1// 简单使用$val s1a is $aa2// 使用方法val s2${s1.replace(is, was)}, but now is $a9. 条件表达式fungetMax(a:Int,b:Int):Int{if(ab){returna}else{returnb}}Kotlin中if也可以写成一个表达式fungetMax(a:Int,b:Int)if(ab)aelseb10. for循环使用inval itemslistOf(apple,banana,kiwifruit)for(iteminitems){println(item)}使用下标val itemslistOf(apple,banana,kiwifruit)for(indexinitems.indices){println(item at $index is ${items[index]})}for(iin1..3){println(i)}for(iin6downTo0step2){println(i)}11. while循环val itemslistOf(apple,banana,kiwifruit)varindex0while(indexitems.size){println(item at $index is ${items[index]})index}12. when表达式when看起来有点像Java里的witch但这两个是不同的东西。fundescribe(obj:Any):Stringwhen(obj){1-OneHello-Greetingis Long-Long!is String-Not a stringelse-Unknown}13. 范围检查一个数字是否在范围中使用in操作val x10val y9if(xin1..y1){println(在范围内)}检查一个数是否超出了范围val listlistOf(a,b,c)if(-1!in0..list.lastIndex){println(-1 超出了范围)}if(list.size!inlist.indices){println(list的size也超出了下标范围)}遍历一个范围for(xin1..5){print(x)}指定步进值for(xin1..10step2){print(x)}println()for(xin9downTo0step3){print(x)}14. 集合遍历一个集合for(iteminitems){println(item)}检查集合中是否包含某个对象用in操作when{orangeinitems-println(juicy)appleinitems-println(apple is fine too)}用lambda表达式对集合进行filter和map操作val fruitslistOf(banana,avocado,apple,kiwifruit)fruits.filter{it.startsWith(a)}.sortedBy{it}.map{it.toUpperCase()}.forEach{println(it)}15. 可为null的值和null检查可以为null的变量后面需要一个问号?下面这个方法返回Int或者nullfunparseInt(str:String):Int?{// ...}使用可能返回null的方法上面那个方法funprintProduct(arg1:String,arg2:String){val xparseInt(arg1)val yparseInt(arg2)// Using x * y yields error because they may hold nulls.if(x!nully!null){// x 和 y 经过null检测后自动变成了非null值println(x*y)}else{println($arg1 or $arg2 不是数字)}}或者写做// ...if(xnull){println(参数错误 arg1: $arg1)return}if(ynull){println(参数错误 arg2: $arg2)return}// x 和 y 经过null检测后自动变成了非null值println(x*y)16. 类型检查和自动转换用is来检查某个对象是不是某个类型。 如果确定某个不可变的变量的类型那后面使用它的时候不用再显式转换fungetStringLength(obj:Any):Int?{if(obj is String){// obj已经自动转换为String类型returnobj.length}// 这里的obj仍然是Any类型returnnull}或者用!isfungetStringLength(obj:Any):Int?{if(obj!is String)returnnull// 这里的obj已经自动转换为String类型returnobj.length}再换个写法fungetStringLength(obj:Any):Int?{// 这里面的obj已经自动转换为String类型if(obj is Stringobj.length0){returnobj.length}returnnull}最后分享一份《史上最详Android版kotlin协程入门进阶实战》目录第一章 Kotlin协程的基础介绍1.1 协程是什么1.2 什么是Job 、Deferred 、协程作用域1.3 Kotlin协程的基础用法第二章 kotlin协程的关键知识点初步讲解2.1 协程调度器2.2 协程上下文2.3 协程启动模式2.4 协程作用域2.5 挂起函数第三章 kotlin协程的异常处理第四章 kotlin协程在Android中的基础应用4.1 Android使用kotlin协程4.2 在Activity与Framgent中使用协程4.3 ViewModel中使用协程4.4 其他环境下使用协程第五章 kotlin协程的网络请求封装5.1 协程的常用环境5.2 协程在网络请求下的封装及使用5.3 高阶函数方式5.4 多状态函数返回值方式5.5 直接返回值的方式第六章 深入kotlin协程原理一6.1 suspend 的花花肠子6.2 藏在身后的- Continuation6.3 村里的希望- SuspendLambda第七章 深入kotlin协程原理二7.1 协程的那些小秘密7.2 协程的创建过程7.3 协程的挂起与恢复7.4 协程的执行与状态机第八章 Kotlin Jetpack 实战8.1 从一个膜拜大神的 Demo 开始8.2 Kotlin 写 Gradle 脚本是一种什么体验8.3 Kotlin 编程的三重境界8.4 Kotlin 高阶函数8.5 Kotlin 泛型8.6 Kotlin 扩展8.7 Kotlin 委托第九章 Kotlin 协程 Retrofit MVVM优雅的实现网络 请求9.1 项目配置9.2 实现思路9.3 协程实现9.4 协程 ViewModel LiveData实现9.5 后续优化9.6 异常处理9.7 更新Retrofit 2.6.0