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

作者: 大漠孤烟直_v | 来源:发表于2020-05-04 12:23 被阅读0次

    一、创建与遍历集合

    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{
     }
    

    相关文章

      网友评论

        本文标题:Kotlin基础(7)-->集合与函数式API

        本文链接:https://www.haomeiwen.com/subject/dydeghtx.html