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<String>) {
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是非空的,即,调用let函数的变量不为null时,执行let函数内部的语句。
let函数作用:1、创建新值2、调用其他函数3、防止变量被修改,传入it值为只读数值,不能修改。
值参为调用者。
返回值为最后一行。
16、!!.非空断言操作符
字符串为空时,抛出空指针异常。
var str : String? = null;
str = "yyy"
//!!.非空断言操作符,
var newStr = str!!.capitalize()
println(newStr)
17、?:空合并操作符
如果左边的求值结果是null,就使用右边的结果值。可以避免null值得出现。
var str : String? = null;
//str = "yyy"
var newstr = str?:"xxx"
println(newstr)
18、解构
List集合支持在解构语法。只要是集合结果都可以用解构赋值。
解构语法:list集合可以同时给多个变量赋值。例如:
var str = "bu,gou,yan,xiao"
val (str1,str2,str3,str4) = str.split(',')
println("str1:$str1,str2:$str2,str3:$str3,str4:$str4")
19、字符串不会被改变
kotlin和Java一样字符串是不会被改变的,无论定义的var或val类型。修改字符串时,都是先拷贝新的字符串,修改拷贝的新的字符串,保持原字符串不变。
20、BigDecimal
21、apply函数
隐式调用对象方法和属性,省去对象名的引用。
返回值为设置属性或者调用过方法后的对象
22、run函数
同apply类似,隐式调用对象方法和属性。
值参为调用者。
返回值为lamada结果,不返回对象
23、with函数
与run函数类似。
返回值为lamada结果,不返回对象
24、also函数
类似与let函数
值参为调用者。
返回值为调用者。
25、takeif函数
判断lamada结果为true或false,若为true,返回值为调用者;若为false,返回null。