Kotlin常见用法

使用心得: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)
        }

  

 
原文地址:https://www.cnblogs.com/lizhanqi/p/14980408.html