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 因为返回值有空 可以配合 ?:使用