小白学习Android开发第三天

  1. 关于匿名函数的用法

匿名函数也是有类型的,可以作为 变量 赋值给 函数类型变量【可以理解一下什么是函数类型变量,这个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集合

猜你喜欢

转载自blog.csdn.net/qq_45204129/article/details/118611919