使用心得:kotlin 比java 的优点在于空指针安全。以及各种简化操作符等。书写美观快速开发
kotlin 几种单利模式
https://www.jianshu.com/p/5797b3d0ebd0
let,with,run,apply,also函数区别
https://blog.csdn.net/u013064109/article/details/78786646
//kotlin 的集中for,不包含迭代器的方式 val al =listOf("ab","ab","ab","ab","ab","ab") //对象方式 for( value in al){ } //下标 for( index in 5..6 ){ } //倒叙 for( index in 6 downTo 1 ){ } //键/值 for( (index,value) in al.withIndex() ){ } //类似map for( index in al.withIndex() ){ index.index index.value } //forEach al.forEach { } //下标跟值 al.forEachIndexed {index,s-> } //下标 for( i in al.indices){ } //下标 for( i in al.indices){ } //下标 loop@for( i in al.indices){ } //关于@符号 loop1@ run loop2@ { loop3@for( i in al.indices){ //结束循环 return@loop3 } } //loop1代表整个run的代码 //loop3代表整个当前循环 //loop2 代表本次run 时候的action 常用的kotlin 加减乘除 // val a=1; a.unaryPlus(); //+a a.unaryMinus() //-a a.inc() //a++ /++a a.dec() //a- /-a a.plus(4) //a+4 a.minus(5)//a+5 a.times(5)//a*5 a.div(5)//a/5 //kotlin 给java属性暴露 @JvmField //适用于变量 var isLogin: Boolean = false @JvmStatic //适用于方法 //重命名class外面的静态类名称可以去掉kt带有kt的静态类问题 @file:JvmName("AD")
koltin list转map: associateBy
kotlin过滤操作符 https://www.cnblogs.com/Jetictors/p/9241867.html 关于集合的操作符,直接引用书上的内容,基本上总结的很好了。 val list = listOf(1, 2, 3, 4, 5, 6) drop 返回包含去掉前n个元素的所有元素的列表。 assertEquals(listOf(5, 6), list.drop(4)) dropWhile 返回根据给定函数从第一项开始去掉指定元素的列表。 assertEquals(listOf(3, 4, 5, 6), list.dropWhile { it < 3 }) dropLastWhile 返回根据给定函数从最后一项开始去掉指定元素的列表。 assertEquals(listOf(1, 2, 3, 4), list.dropLastWhile { it > 4 }) filter 过滤所有符合给定函数条件的元素。 assertEquals(listOf(2, 4, 6), list .ilter { it % 2 == 0 }) filterNot 过滤所有不符合给定函数条件的元素。 assertEquals(listOf(1, 3, 5), list.filterNot { it % 2 == 0 }) filterNotNull 过滤所有元素中不是null的元素。 assertEquals(listOf(1, 2, 3, 4), listWithNull.filterNotNull()) slice 过滤一个list中指定index的元素。 assertEquals(listOf(2, 4, 5), list.slice(listOf(1, 3, 4))) take 返回从第一个开始的n个元素。 assertEquals(listOf(1, 2), list.take(2)) takeLast 返回从最后一个开始的n个元素 assertEquals(listOf(5, 6), list.takeLast(2)) takeWhile 返回从第一个开始符合给定函数条件的元素。 assertEquals(listOf(1, 2), list.takeWhile { it < 3 }) https://blog.csdn.net/yu540135101/article/details/113246177
协程使用
android { //解决kotlin 使用java1.8特性的问题 kotlinOptions { jvmTarget = '1.8' } //协程开启 kotlin { experimental { coroutines 'enable' } } ...... }
协程: 1.launch 2. async 3.runBlocking 区别: launch不会阻断协程。 async** 支持返回动的协程任务会阻断当前协程**,直到该协程执行结束。当协程执行结束之后,页面才会被显示出来。 协程上下文: Dispatchers.Main:使用这个调度器在 Android 主线程上运行一个协程。可以用来更新UI 。在UI线程中执行 Dispatchers.IO:这个调度器被优化在主线程之外执行磁盘或网络 I/O。在线程池中执行 Dispatchers.Default:这个调度器经过优化,可以在主线程之外执行 cpu 密集型的工作。例如对列表进行排序和解析 JSON。在线程池中执行。 Dispatchers.Unconfined:在调用的线程直接执行。 启动模式 DEFAULT 默认的模式,立即执行协程体 LAZY 只有在需要的情况下运行 ATOMIC 立即执行协程体,但在开始运行之前无法取消 UNDISPATCHED 立即在当前线程执行协程体,直到第一个 suspend 调用 用法: runBlocking { } async 用法需要搭配 runBlocking { //类似flutter val a= GlobalScope. async { return@async "123456" } var bs= a.await() } GlobalScope.launch { val a= GlobalScope. async { return@async "123456" } a.await() } GlobalScope.launch { L.d("协程环境运行未指定"+Thread.currentThread().name) } GlobalScope.launch(newSingleThreadContext("MyThread")) { L.d("协程环境运行"+Thread.currentThread().name) } GlobalScope.launch(Dispatchers.Main) { L.d("协程环境运行指定Main"+Thread.currentThread().name) } GlobalScope.launch(Dispatchers.Default) { L.d("协程环境运行Default"+Thread.currentThread().name) } GlobalScope.launch(Dispatchers.IO) { L.d("协程环境运行IO"+Thread.currentThread().name) }