码迷,mamicode.com
首页 > 其他好文 > 详细

kotlin基础语法

时间:2021-01-08 10:40:20      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:util   类的成员   ber   逗号   函数   cte   get   lam   coroutine   

Val:用来声明图个不可变的变量, Var:用来声明图个可变的变量 Kotlin没有基本数据类型 语法糖 当函数(方法)只有一行是Kotlin允许不写函数体可以直接将唯一的一行代码第一在函数尾部。利用类推导机制进一步简化。 fun a(num:Int,num1:Int):Int = max(num,num1) fun aa(num:Int,num1:Int) = max(num,num1) 两种条件语句if 和 when If语句 Java写法: fun a(num:Int,num1:Int):Int{ ? var v = 0 ? if(num>num1){ ? v=num ? }else{ ? v=num1 ? } ? return v } Kotlin比java增加了一个额外的功能他是可以有返回值的,返回值就是if语句每一个条件中最后一行代码的返回值。 fun a(num:Int,num1:Int):Int{ ? var v = if(num>num1){ ? num ? }else{ ? num1 ? } ? return v } 这样的话v就也是一个多余的变量值所以去掉: fun a(num:Int,num1:Int):Int{ ? return if(num>num1){ ? num ? }else{ ? num1 ? } } 进一步精简: fun a(num:Int,num1:Int):Int= if(num>num1){ ? num ? }else{ ? num1 ? } 究极进化:秘术 fun a(num:Int,num1:Int):Int= if(num>num1) num else num1 When语句(像java的switch语句但是比他强大)允许传入一个任意类型的参数,然后可以再when的结构体中定义乙烯类的条件格式是: 匹配值->{执行逻辑} private fun a(name:String)=when(name) { ? "a"->77 ? "b"->55 ? else->0 } 除了精确匹配外when还允许类型匹配 Number Kotlin的一个内置抽象类,与数字相关的类都是他的子类。 is关键字是类型匹配的核心相当于java的 instabceof关键字 fun b(num:Number){ ? var num :Int = 10 ? when(num){ ? is Int-> println("是他") ? is Double-> println("是他") ? else ->println("都不是") ? } } When还有一种不带参数的场景。 循环语句 While和for循环语句 for-in循环(java中的for-each的加强版 for-i不用) 区间:0..10 双端闭合 For(i in 0..10){ println(i) } 打印出是0到10的数字 nutil关键字创建一个左闭右开的区间 0 nutil 10 最后一个10不会打印 默认情况for-in每次循环区间范围递增1相当于java for-i中的i++效果,想跳过一些元素可以使用step关键字 For(i in 0 until 10 step 2){ 这样打印出来相当于i+2效果 } 使用降序的区间 downTo关键字for(i in 10 downTo 1){ 打印:10到1的数字 } downTo也可以结合step使用 Kotlin中默认所有非抽象类不可以被继承让他可以被继承要加open关键字就可以了。 类: 主构造函数和次构造函数:主构造函数没有函数体直接定义在类名后面(每个类默认有一个不带参数的主构造函数) 因为主构造函数没有函数体所以需要写的逻辑都写在init{}结构体中 Constructor关键字次函数体

函数可见修饰符: Public 一样 所有类可见 Kotlin中的默认 Private 当前类可见 Protected java当前类子类同一包路径下的类Kotlin当前类、子类可见 Default同一包路径下的类 默认java Internal 同一模块中的类可见Kotlin

data代表的是数据类 object代表的是单利类

集合的创建 listOf创建的是一个不可变的集合。意思是:只能读取,不能增删改。 MutablelistOf创建的是可变的集合。

setOf创建的是一个不可变的集合。意思是:只能读取,不能增删改。 MutablesetOf创建的是可变的集合。

MapOf创建的是一个不可变的集合。意思是:只能读取,不能增删改。 MutableMapOf创建的是可变的集合。 to不是关键字是infix函数 Lambda表达式: {参数名1:参数类型,参数名2:参数类型->函数体} 函数体可以写任意行代码最后一行默认为返回值 只有一个参数是可以用it关键字表示 Val a=list.maxBy{it.length} Val a=list.maxBy(){f:string->f.length} 集合中API maxBy 最长的 map将元素改成另外的值 filter过滤集合中的数据 Any判断集合中是否至少有一个满足条件 All判断集合中是否所有元素都满足条件 ?.当对象不为空是正常调用为空什么都不做 ?:左右两边都接受一个表达式如果做边成立就返回左边否则右边 Fun a(t:string?)=t?.tength?:0 !!非常确信的不为空

Let是一个函数 Fun d(s:s?){ S?.let{ It.a() It.b()

} } 字符内嵌表达式${} 标准函数 With run apply With接受两个参数第一个可以是任意类型的第二个lambda表达式 Run只接受一个lambda表达式(只有一个参数) apply只接受一个lambda表达式(只有一个参数)返回对象本身 定义静态方法 Companion object伴生类 定义局部单利 @JvmStatic注解编译器会变成真正的静态方法 只能加在Companion object 和object 上 顶层方法 创建File 顶层方法会被全部编译成静态方法 调用时直接调用 延迟初始化:lateinit ::判断是否已经初始化 密封类的关键字:sealed class 高阶函数: 定义一个函数类型,声明该函数接收什么参数以及他的返回值是什么。->左边部分用来声明该函数接收什么参数,多个参数之间用逗号隔开,如过不接受任何参数用空括号。右边部分用于声明返回值是什么类型 调用方法: Val v=n(q,w,::n()) Inline内联函数:kotlin编译器会将内联函数中的代码在编译的时候自动替换到调用它的地方。 Nolinline 禁止部分内联 类委托和类委托属性 委托是一种设计模式,基本理念是操作对象自己不会去处理某段逻辑,而是会把工作委托给另一个辅助对象去处理。 委托的关键字:by在接口声明后面再加上受委托的对象。 lazy高阶函数 Val v by lazy{ 创建并返回一个实例对象 } Infix函数 语法糖。两个严格限制:1,不能定义成顶层函数,必须是某个类的成员函数,可以使用扩展函数的方式将他定义到某个类中。2,只能接收一个参数,类型无限制 协程: 协程允许在单线程下模拟多线程操作 GlobalScope.launch顶层协程 launch子协程 必须在协程作用域有效 Delay 当前协程挂起 runBlocking可以保证再其作用域内子协程或代码没有执行完一直堵塞当前线程(测试环境) Reoeat函数循环 Suspend关键字:可以将任何函数声明成挂起函数,挂起函数之间可以相互调用。 coroutineScope是挂起函数:继承外部的协程作用域并创建一个子作用域,借助这个特性可以给任何挂起函数提供协程作用域。 Job.cancel取消协程 Async函数在协程作用域有效返回结果 await要结果 withContext是Async简化版立即返回结果 withContext要求指定一个线程参数有三种值:Default默认低并发的一种线程策略。Io高并发的线程策略,比如执行网络请求。Main不会开启子线程(纯Kotlin项目参数会出现错误) SuspendCoroutine:作用将当前协程立即挂起 Resume或ResumeWithExcptoin可以让协程恢复运行 jetPack ViewModel:专门用于存放于界面相关的数据,只要在界面能看到的相关数据他的变量就应该放在ViewModel中大大减少了Activity的逻辑 ViewModelProviders.of(<你的activity或fragment的实例>).get(<你的ViewModel>::class.Java) Lifecycles感知activity的生命周期 LiveData他可以包含任何类型的数据,并发生变化的时候通知观察者。 MutableLiveData是一种可变的LiveData主要由三种读写数据:getValue()获取LiveData中包含的数据setValue方法给LiveData设置数据,只能在主线程用。PostValue用于非主线程给LiveData设置数据。 LiveData的两种转换方法:TransFormations.map和switchMap {LiveData之所以能够成为Acyivity和ViewModel之间的桥梁,并且不会出现内存泄漏的风险,靠的就是Lifecycles组件。LiveData在内部使用了Lifecycles组件来自我感知生命周期的变化。从而可以再activity销毁的时候及时释放引用,避免产生内存泄漏的愿意} Room数据库

kotlin基础语法

标签:util   类的成员   ber   逗号   函数   cte   get   lam   coroutine   

原文地址:https://www.cnblogs.com/yinweireai/p/14240086.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!