Kotlin小节

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。

猜你喜欢

转载自blog.csdn.net/github_27263697/article/details/131766435