1、Kotlin只提供引用类型这一种数据类型。
2、===和!==的含义
=== 计算两个实例是否指向同一引用
!== 计算两个实例是否不指向同一引用
3、条件表达式给变量赋值
var healthstr = if(health == 100)"It is excellent" else "It is awful"
4、when表达式
是Kotlin的另一个控制流工具。类似于if/else语句,
when表达式允许你编写条件式,非常适合有三到四个分支的情况。
相比以前的if/else语句,when表达式能让代码更简洁易读。实践经验表明,只要代码包含else if分支,都建议改用when表达式。
5、asList()和toList()的区别
asList():
仍然保持对原始Array
的引用。 这意味着该列表的突变也会改变基础Array
。
toList():
只是将Array
的值复制到一个新的List
,但是之后没有任何延续的链接。
6、const变量
不在函数或类内,它是文件级变量。
const val NUMBER_VALUE = 10;//定义const变量
在项目范围内,你都能看到或使用这个文件级变量(当然,有需要的
话,可以添加可见性修饰符,修改其可见性)。文件级变量保持着初
始化状态,一直到应用程序执行结束。
文件级变量在定义时就必须赋值,否则代码就无法编译(在第15章,
你会看到这方面的代码异常)。这种强制要求可避免代码异常,例
如,你正要使用某个变量,而它却没有值。
7、单表达式函数语法
只需要使用赋值运算符=后跟表达式就可以了。
8、Unit函数
如函数无返回值时,返回类型为Unit类型。
通过使用Unit作为返回类型,Kotlin解决了这一难题。Unit表示一
个函数不返回任何东西,同时,也能兼容需要和一些类型打交道的泛
型函数。无论有无类型,都不是问题,这正是Kotlin使用Unit的原
因。
9、具名函数参数
如果不用具名函数值参,就必须按函数头的定义,严格按顺序
传入值参。而有了具名函数值参,传入值参时就可以不管函数头的参
数顺序了。
private fun formlate(str: String = "abc"): String {//设置形参默认值为abc var healthstr1 = "healthstr" health = 56; healthstr1 = when (health) { 100 -> "A" 90 -> "B" 80 -> "C" 60 -> "D" else -> { formlate1(number = 90, str = "www")//具名函数参数 } } println("healthWhen:$healthstr1, str:$str") return healthstr1 }
private fun formlate1(str: String = "abc", number: Int) = when (health) { 100 -> "A" 90 -> "B" 80 -> "C" 60 -> "D" else -> { "str:$str, number:$number" }
10、TODO函数返回值类型为Nothing类型
TODO()函数调用后的语句不执行。
fun main(arrays: Array) { tesetTODU() }
fun tesetTODU(){ println("Test will be processed") TODO() println("Test is processed") }
10、java文件引用kt文件方法和变量
java文件里应用kt文件中文件级别方法或者变量,需要使用”类名+kt“ 去调用
public class RunMain { public static void main(String[] args) { System.out.println("hello world!"+TestDemoKt.formlate("DEF")); } }
fun formlate(str: String = "abc"): String {//设置形参默认值为abc var healthstr1 = "healthstr" health = 56; healthstr1 = when (health) { 100 -> "A" 90 -> "B" 80 -> "C" 60 -> "D" else -> { formlate1(number = 90, str = "www")//具名函数参数 } } println("healthWhen:$healthstr1, str:$str") return healthstr1 }
11、匿名函数,又叫做lamada表达式
在一对花括号里定义匿名函数。
var customFunction2:(String)->String = { var num = 10 "num:$num it:$it" }
在花括号的后面跟上一对空的圆括号,表示调用匿名函数。圆括号不能省。
println(customFunction2("elena"))
返回值:没有return关键字,为了返回数据,匿名函数会隐式或自动返回函数体最后一行语句的结果。
参数:参数的类型放在匿名函数的类型定义中,参数名则放在函数定义中。
it关键字语法只适用于一个参数的情况。匿名函数支持多个参数。如
果有多个参数,需要使用命名参数。
如果一个函数的lambda参数排在最后,或者是唯一的参数,那么括住
lambda值参的一对圆括号就可以省略。所以之前的代码:
一个参数的情况:
fun functionAsParamTest2(customFunction6 :(String , Int) -> String ){ println("customFunction6:"+customFunction6("nnn",999)) } functionAsParamTest2({name:String, age:Int -> var num = 99 "num:$num name:$name age:$age" }) 就可以简写成这样: functionAsParamTest2{name:String, age:Int -> var num = 99 "num:$num name:$name age:$age" }
两个参数的情况:
functionAsParamTest3(888,{name:String, age:Int -> var num = 99 "num:$num name:$name age:$age" })
可以简写成这样:
functionAsParamTest3(888){name:String, age:Int ->//匿名函数作为参数,最好写在最后 var num = 99 "num:$num name:$name age:$age" }
三个参数的情况:
functionAsParamTest4(888,"teacher",{name:String, age:Int ->//三个参数的情况,匿名函数排在参数列表最后,可以省区圆括号 var num = 99 "num:$num name:$name age:$age" })
可以简写成这样:
functionAsParamTest4(888,"teacher"){name:String, age:Int ->//三个参数的情况,匿名函数排在参数列表最后,可以省区圆括号 var num = 99 "num:$num name:$name age:$age" }
使用这种简略语法后,代码更简洁易读,能够让人快速抓住重点。这种简略写法只支持lambda参数排在最后的情况,所以,定义函数时,建议把函数类型的参数放在最后,以方便调用者使用。
12、函数引用(形参类型是函数类型)
函数形参类型是函数类型,函数引用作为值参。使用时需要::加上函数名即可。
形参函数的返回值需要是Unit类型。
functionReference("student", ::getPersonInfo)
//函数引用 fun functionReference(career:String ,getInfo:(String, Int)->Unit){ println("career:$career,"+getInfo) } fun getPersonInfo(name:String, age:Int){ "name:$name,age:$age" }
13、返回类型是函数类型
var function = functionReturnFunction()
println(function("egg", 100))
fun functionReturnFunction(): ((String, Int) -> String) { //返回类型是函数类型 return { name: String, age: Int -> println("返回值为函数")//只返回函数本身,不执行函数体 "name:$name ,age:$age" } }
14、安全调用操作符(?.)
var str : String? = null; str = "yyy" var len = str?.length println(str)
15、let安全调用函数
任何类型的数据都可以调用let函数。
it是非空的
16、!!.非空断言操作符
var str : String? = null;
str = "yyy"
//!!.非空断言操作符 var newStr = str!!.capitalize() println(newStr)
17、?:空合并操作符
如果左边的求值结果是null,就使用右边的结果值。