Kotlin基础(7)-->集合与函数式API

一、创建与遍历集合

1.List与Set集合

(1).不可变集合:无法进行增删改查操作
val list = listOf("王大锤", "愣子", "欧阳疯子")
(2).可变集合:可以进行增删改查操作
 val list = mutableListOf("王大锤", "愣子", "欧阳疯子")
        list.add("李大麻子")
        for (i in list) {
            println(i)
        }
       //输出日志:王大锤 愣子 欧阳疯子 李大麻子

Set用法与List一模一样,只是替换成了setOf()mutableSetOf(),另外List是有序的,Set是无序的。

2.Map集合

(1).数组下标语法结构的写法
    val map = HashMap<String, Int>()
    map["王大锤"] = 1
    map["李大麻子"] = 2
    map["愣鬼"] = 3

取数据

val number = map["愣鬼"]
(2).mapOf、mutableMapOf的写法
val map = mapOf("王大锤" to 1, "李大麻子" to 2, "愣鬼" to 3)
    for ((key, value) in map) {
        println(key + value)
        //输出日志:王大锤1 李大麻子2 愣鬼3
    }

二、集合的函数式API

1.Lambda表达式

Lambda的定义:Lambda就是一小段可以作为参数传递的代码。
Lambda语法结构:{参数名1 : 参数类型 , 参数名2 : 参数类型 -> 函数体},首先最外层是一对大括号,如果有参数传入的话,需要声明参数列表,参数列表的结尾使用一个 -> 符号,表示参数列表的结束与函数体的开始,函数体中可以编写任意行代码,并且最后一段代码会自动作为Lambda的返回值。

(1)maxBy()函数

工作原理:它接受的是一个Lambda类型的参数,根据我们传入的条件来遍历集合,从而找到条件下的最大值。
eg:找出集合中单词最长的名字:

 val list = listOf("王大锤", "愣子", "欧阳疯子")
    var maxLenthName = ""
    for (i in list) {
        if (i.length > maxLenthName.length) {
            maxLenthName = i
        }
    }

使用集合式API简化后

val list = listOf("王大锤", "愣子", "欧阳疯子")
    //简化一
    val lambda = { name: String -> name.length }
    list.maxBy(lambda)
    //简化二
    list.maxBy({ name: String -> name.length })
    //简化三
    list.maxBy() { name: String -> name.length }
    //简化四
    list.maxBy { name: String -> name.length }
    //简化五
    list.maxBy { name -> name.length }
    //简化六
    list.maxBy { it.length }

原理:
1.当Lambda参数是函数最后一个参数时,可以将Lambda表达式移到函数括号外面 (二到三)。
2.当Lambda参数势函数唯一一个参数时,可以将函数的括号省略(三到四)。
3.由于Kotlin拥有出色的类型推导机制,Lambda表达式中的参数列表大多数情况下不必声明参数类型(四到五)。
4.当Lambda表达式中的参数列表只有一个参数时,不必声明参数名,可以使用it关键字来代替(五到六)。

接下来我们再学习几个常见的函数式API

(2)map()函数

工作原理:用于将集合中每个元素都映射成一个另外的值,映射规则在Lambda表达式中指定,最终生成一个新的集合。eg:

fun main() {
    val list = listOf("apple", "banana", "pear")
    val newList = list.map { it.toUpperCase() }
    for (i in newList) {
        print(i)
        //输出日志:APPLE BANANA PEAR
    }
}
(3)filter()函数

工作原理:用来过滤集合中的数据,过滤规则在Lambda表达式中指定,,最终生成一个新的集合,可结合map()函数使用。eg:

un main() {
    val list = listOf("apple", "banana", "pear")
    val newList = list.filter { it.length > 4 }.map { it.toUpperCase() }
    for (i in newList) {
        print(i)
        //输出日志:APPLE BANANA
    }
}
(4)any()函数与all()函数

any():用于判断集合中是否至少存在一个元素满足指定条件。
all():用于判断集合中是否全部函数都满足指定条件。
eg:

fun main() {
    val list = listOf("apple", "banana", "pear")
    val anyResult = list.any() { it.length == 4 }
    val allResult = list.all() { it.length == 4 }
    println("anyResult is " + anyResult + " ,allResult is" + allResult)
    //输出日志:anyResult is true ,allResult isfalse
}

三、Java的函数式API

含义:我们在Kotlin中调用一个Java方法,并且该方法接收一个Java单抽象方法接口参数,就可以使用函数式API。Java单抽象方法接口指的是接口中只有一个待实现的方法,如果接口中有多个待实现的方法,则无法使用函数式API。
举个栗子:Java中最常见的单抽象方法接口--Runnable接口:

new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("Thread is running");
            }
        }).start();

使用Kotlin版本:

Thread(object : Runnable {
        override fun run() {
            print("Thread is running")
        }
    }).start()

使用函数式API简化:

 //简化一
    Thread(Runnable {
        print("Thread is running")
    }).start()
    //简化二
    Thread {
        print("Thread is running")
    }.start()

原理:因为只有一个待实现方法,我们就算不写,Kotlin也会明白。另外,如果一个Java参数列表中不存在一个以上Java单抽象方法接口参数,我们还可以将接口名进行省略。

Android中常用的点击事件接口OnclickListener就是一个单抽象方法接口,就可以使用函数式API

tv.setOnClickListener{
 }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章