- 关于匿名函数的用法
匿名函数也是有类型的,可以作为 变量 赋值给 函数类型变量【可以理解一下什么是函数类型变量,这个count是函数类型变量吗?】那么此时的匿名函数就和其他的变量一样,匿名函数就可以再代码里进行传递。
匿名函数的类型由 传入的参数和返回值类型 决定。所以匿名函数作为变量给函数类型变量后,函数类型变量的类型就是由匿名函数的参数和返回值类型决定的。
匿名函数除开极少数的情况【哪些情况下有返回值】,不需要return关键字返回数据。会隐式或者是自动返回函数体最后一行语句的结果。
val count : Int = "huidgiuhjkgui".count({
letter -> letter == 'i'
})
print(count)
//声明一个变量,变量的类型是由 匿名函数的参数和返回值类型决定的
//这里的变量是NiBl,类型 是由下面这个匿名函数的参数类型【无参】,返回值类型【String】
val NimBl : () -> String
NimBl = {
//这里就是一个匿名函数,没有参数,返回值是看最后一行语句的执行结果。
val name = "Anber"
"jsghuj $name"
}
print(NimBl)
关于匿名函数的参数怎么写?
匿名函数可以带0到多个参数,
//刚刚的是一个没有传入参数的匿名函数,现在我们看一下有多个参数的传入应该怎么办
val NiBl2 : (String,Int) -> String
NiBl2 = { sno, age ->
val sex = 0
"$sno is $sex and $age years old"
}
println(NiBl2("3120405012", 18))
自己思考一下,结合之前学的知识when,将sex可以改为输出,0位女,1为男。
val NiBl2 : (String,Int,Int) -> String
NiBl2 = { sno, age, sex ->
when (sex){
0 -> "$sno is girl and $age years old"
else -> "$sno is boy and $age years old"
}
}
println(NiBl2("3120405012", 18, 0))
关于匿名函数的类型推断
//其实根据类型推断,类型可以不用指明,这也是一个匿名函数传给一个函数类型变量
val NimBl1 = {
//这里就是一个匿名函数,没有参数,返回值是看最后一行语句的执行结果。
val name = "Anber"
"jsghuj $name"
}
println(NimBl1)
这样也可以,函数参数类型在匿名函数中写
val NiBl3 = { sno: String, age: Int, sex: Int ->
when (sex){
0 -> "$sno is girl and $age years old"
else -> "$sno is boy and $age years old"
}
}
println(NiBl3("3120405012", 18, 0))
补充: 1)在一个函数中,如果传入参数,参数可以是上面这种函数类型的参数,但具体怎么用
NiMTest("anber",{name : String , age: Int ->
" $name is $age years old "
})
}
fun NiMTest(name: String, Nim: (String, Int) -> String){
var age = (1..20).random()
println(Nim(name, age))
}
2)函数类型作为返回值类型
fun FunF (): (String) -> String{
return {name: String ->
"hjsgbxbkhi"
}
2.闭包
3.关于lambda 的用法
想kotlin中定义的lambda会以对象实例的形式存在,JVM会为这些对象实例分配内存,会产生内存开销,但是在kotlin中有一个优化机制,内联
4.关于在kotlin中的异常处理机制
学习一下关于自己定义的异常类,其他和Java一样。
5.== 和 === 的比较
== 比较的是两个字符串内容
=== 比较的是两个字符串的地址,字符串的常量池,是否是同一个引用
val n = "Hj"
val m = "hj".capitalize()
println(n==m) //true
println(n === m ) //false
字符串常量池有三个对象,所以地址是不一样的
6.关于类型转换
7.标准库函数
Apply函数:是一个配置函数,可以传入一个接收者,然后调用一系列函数来配置它以便于使用,如果提供lambda给apply函数执行,它会返回配置好的接收者。File2 就是用Apply进行配置的,返回file2
val file = File("D:\\aa.txt")
file.setReadable(true)
file.setWritable(true)
val file2 = File("D:\\aa.txt").apply {
setReadable(true)
setWritable(true)
}
let函数:能使某个变量作用于其lambda表达式里面,让it关键字可以引用它,let会吧接收者传给lambda,而apply不传,apply会返回当前接收者(返回的是File),而let会返回lambda的最后一行。(这里是it*it的数值给)
val num = listOf<Int>(2,245,55).first().let {
it * it
}
println(num)
run函数:不返回接收者,返回的是lambda的结果,也就是true或者是false,同时具备Apply的隐式调用,同时也有let返回lambda的执行结果,
val rw = File("D:\\aa.txt").run {
readText().contains("gdyg")
}
println(rw)
with函数:和run传参的方式不同
also函数:和let功能相似,把接收者对象传入,并且返回接收者对象
takeif函数:需要判断,如果执行结果是true,则takeif函数返回接收者对象,如果执行结果是false,则返回null
takeUnless函数:和takeif相反的
8.集合类型的创建
List set map 只读和可变
(1)list集合
var list = listOf<String>("dhuio","huidhg","jdiwh")
println(list.getOrElse(2){
"nothing"
})
println(list.getOrNull(3) ?: "nothing")
可变的list是用mutableList
var mutableList = mutableListOf("mkjc",111,'h')
mutableList.add("jisjd")
mutableList.removeAt(1)
mutableList += "ji"
println(mutableList)
集合的遍历:
for (s in list) {
println(s)
}
list.forEach{
print(it)
}
list.forEachIndexed { index, item ->
print("$index is $item")
}
集合的解构:解构就是一次性通过集合给多个元素赋值,
val(a :String, _: String, c: String) = list
这里就是说将list中的元素赋值给a,c,中间的b值是不需要的,所以就用_来表示不需要的。
Distinct()函数是list的去重。
(2)set集合
Set集合特点就是不可重复,无序的。
val set = setOf(1, "njkd", 'n')
println(set)
for (item in set) {
println(item)
}
set.forEach{
println(it)
}
set.forEachIndexed { index, any ->
print("$index is $any.." )
}
(3)map集合