Kotlin基础总结

1.kotlin在定义变量的时候 要给初始值

可以定义为null 但是要加? 但是后边使用这个变量的时候都是?.

 

2.kotlin中的函数不依赖类存在 ,就是可以在类外写方法 Java中方法是依赖类存在的

3. kotlin 的内置数据类型

String Char Int Double List Set Map

4.kotlin 的编译时常量

用关键词const val。声明的时候位置 不能在局部变量的位置

在函数内定义错误是因为 在运行时才能进行赋值 不符合要求 编译时常量 在编译时就要初始化

5.range表达式 

        for (i in 0..50){
            Log.d(TAG, "onCreate: i$i")
        }
        for (i in 0 until 50){
            Log.d(TAG, "onCreate:until i$i")
        }
        for (i in 50 downTo 1){
            Log.d(TAG, "onCreate:downTo i$i")
        }

6.函数的定义

val funAction = {number1, number2, number3 ->
    "第一个参数是$number1 第二个参数是$number2 第三个参数是$number3"
}
val funAction:(Int, Int, Int) ->String = {number1, number2, number3 ->
    "第一个参数是$number1 第二个参数是$number2 第三个参数是$number3"
}

println(funAction(1,2,3))

kotlin的匿名函数&lambda

匿名函数不要写return 最后一行就是返回值  如上边的例子  返回值就是一个string

it关键字

如果入参只有一个 可以等价于参数的变量名就是i

匿名函数等价于lambda表达式

在kotlin中定义入参是函数的函数

等价于java中的接口的简易实现

内联函数

如果有使用lambda作为参数 就需要将函数声明为内联  如果不使用内联 调用时就会生成多个对象 影响性能  内联的关键字 inline 调用时会直接调用 内部会做优化 会减少方法 对象的开辟 减少损耗

lambda属于函数类型的引用 具体可以看下边的例子

//第一种
fun main(args: Array<String>) {
    login("hzz","hzz"){message, code ->
        println("登陆结果为: message$message code$code")
    }
}
const val USERNAME = "hzz"
const val PASSWORD = "hzz"
inline fun login(name: String, password: String,
    response: (String, Int) -> Unit
) {
    if (name == USERNAME && password == PASSWORD){
        response("登陆成功", 200)
    }else {
        response("登陆失败", 404)
    }
}

//第二种
fun main(args: Array<String>) {
 /*   login("hzz","hzz"){message, code ->
        println("登陆结果为: message$message code$code")
    }*/
    login("hzz","hzz", ::responseResult)
}
const val USERNAME = "hzz"
const val PASSWORD = "hzz"
inline fun login(
    name: String, password: String,
    response: (String, Int) -> Unit
) {
    if (name == USERNAME && password == PASSWORD){
        response("登陆成功", 200)
    }else {
        response("登陆失败", 404)
    }
}

fun responseResult(msg: String, code: Int){
    println("登陆结果为: message$msg code$code")
}

对比我们上述代码中的  第二种实现方式 

::responseResult  就等价于第一种中的lambda表达式  所以说而  ::操作符则表明这是一个函数的引用

函数类型可以作为返回类型

    fun showMethod(info: String): (String, Int) ->String{
        print("info = $info")
        return {name: String, age: Int ->
            "name$age"
        }
    }

同时我们还需要对比一下lambda表达式与函数

 lambda表达式是不需要return的 他的最后一行就是他的返回值  而函数 方法或者说函数的定义是需要返回值return的

7.对空的控制?, !!

8.内置函数

let函数
最常用的场景就是使用let函数处理需要针对一个可null的对象统一做判空处理。
name?.let{
    将name 作为一个 it放入此的括号中
    "最后一行也就是我们的输出结果"
}
also内置函数
返回当前的这个对象,一般可用于多个扩展函数链式调用
name?.also{
    返回值类型跟info的类型一样  持有的时it  返回值是info本身
}  
run内置函数
个人感觉跟let基本一样。但是由于参数是this 不像let调用属性的时候还需要it.  run函数可以直接属性名调用到
info.run{
    将info 作为this 传入括号  返回值根据最后一行变化
} 
apply内置函数
一般的适用场景是在进行初始化赋值的时候
info.apply{
    始终返回的时info本身  apply持有一个this  this等同于info本身  返回值始终时info本身
} 
takeif 内置函数 可以理解为takeIf是一个过滤器
info.takeIf{
    true/false
} //true的话返回info本身  false的话返回null   因为返回值有空 可以配合   ?:使用

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值