Lambda编程(kotlin)(上)

2022/3/5 17:15:30

本文主要是介绍Lambda编程(kotlin)(上),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Lambda编程

集合

集合的创建与遍历

集合包括List、Set和Map,它们在Java中都是接口

List的主要实现类是ArrayList和LinkedList,Set的主要实现类是HashSet,Map的主要实现类是HashMap

(1)List集合
  • fun main(){
        val list=listOf<String>("a","b")
        for(num in list){
            println(num)
        }
    }
(2)Set集合

Set集合的用法与List集合的用法基本一致,只是将创建集合的方式换成了setOf( )和mutableSetOf( )函数而已。

  • fun main(){
        val set=setOf<String>("Apple","Orange","Peach")
        for (n in set){
            println(n)
        }
    }

    需要注意的是,Set集合底层是使用hash映射机制来存放数据的,因此集合中的元素无法保证有序,这是Set集合和List集合最大的不同。属于数据结构相关内容

(3)Map集合

Map是一种键值对形式的数据结构,因此在用法上和List、Set集合有较大的不同。

传统的Map用法是先创建一个HashMap的实例,然后将一个个键值对数据添加到Map中

  • 下面的写法与Java的语法最为相近

    fun mian(){
        val map=HashMap<String,Int>()
        map.put("Apple",1)
        map.put("Orange",2)
        map.put("Peach",3)
    }

    然而实际在kotlin中并不建议使用put( )和get( )方法来对Map进行添加和读取数据操作,而是更加推荐使用一种类似于数组下标的语法结构

  • kotlin中的写法

    • 向Map中添加一条数据可以如下书写

      map["Apple"]=1
    • 而从Map中读取这一条数据就可以这么写

      val n=map["Apple"]

    也就是说,在kotlin中Map集合的写法就变成了如下形式

    fun main(){
        val map=HsahMap<String,Int>()
        map["Apple"]=1
        map["Orange"]=2
        map["Peach"]=3
    }

    而这并不是kotlin中最简便的书写方式,因为kotlin中提供了一对mapOf( )和mutableMapOf( )函数来继续简化Map的用法

    fun main(){
        val map=mapOf("Apple" to 1,"Orange" to 2,"Peach" to 3)
        for((m,n) in map){
            println("m is "+m+",n is "+n)
        }//for-in循环
    }

集合的函数式API

这里重点学习函数式API的语法结构,也就是Lambda表达式的语法结构

简单的API运用实例

首先确立一个需求:找出集合中单词最长的代码

  • 一般来说我们可以通过对length的逐个对比得到结果

    fun main(){
        val l=listOf<String>("asx","s","qza","amount")
        var maxLength = ""
        for (m in l){
            if (m.length > maxLength.length) {
                maxLength = m
            }
            println("max length is "+maxLength)
        }
  • 而当我们使用函数式API时,这个功能的实现就可以变得更为简便

    fun main(){
        val list=listOf<String>("asx","s","qza","amount")
        val max=list.maxByOrNull{it.length}
        println(max)
    }
Lambda表达式

Lambda是一小段可以作为参数传递的代码,kotlin中没有对代码数量进行限制,但通常不建议在Lanbda表达式中编写太长的代码,以免影响代码的可读性。

{参数名1:参数类型;参数名2:参数类型 ->函数体}
//->表示参数列表的结束,即函数体的开始。

函数体中可以编写任意代码,但不建议太长。

同时最后一行代码会自动作为Lambda表达式的返回值

多数情况下我们并不需要使用Lambda表达式完整的语法结构,而是有很多种简化的写法

  • 首先我们按Lambda表达式的语法结构书写

    fun main(){
        val list= listOf("APPle","mad","internet")
        val lambda={m:String->m.length}
        val max=list.maxByOrNull(lambda)
        print(max)
    }
  • 接着我们对这段代码进行简化

    我们不需要专门定义一个lambda的变量,而是可以直接将lambda表达式传入maxByOrNull函数中,如下:

    fun main(){
        val list= listOf("APPle","mad","internet")
        val max=list.maxByOrNull({m:String->m.length})
        print(max)
    }
  • 同时kotlin规定,当Lambda参数是函数的最后一个参数时,可以将Lambda表达式移到函数括号的外面,因此继续简化代码如下

    fun main(){
        val list= listOf("APPle","mad","internet")
        val max=list.maxByOrNull(){m:String->m.length}
        print(max)
    }
  • 需要注意的是,当Lambda参数是函数唯一的一个参数时,函数的括号可以省略

    fun main(){
        val list= listOf("APPle","mad","internet")
        val max=list.maxByOrNull{m:String->m.length}
        print(max)
    }
  • 由于kotlin拥有出色的类型推导机制,实际上Lambda表达式中的参数列表在大多数的情况下是不必声明参数类型的,也就是说代码可以进一步简化

    fun main(){
        val list= listOf("APPle","mad","internet")
        val max=list.maxByOrNull{m ->m.length}
        print(max)
    }
  • 最后,当Lambda表达式的参数列表只剩下一个参数时,也不再需要声明函数名了,而可以用it关键字来代替,于是代码最终可以简化为如下形式

    fun main(){
        val list= listOf("APPle","mad","internet")
        val max=list.maxByOrNull{it.length}
        print(max)
    }

其他几种常用的函数式API

map函数

集合中的map函数是最常用的一种函数式API,它用于将集合的每个元素都映射成一个另外的值,映射的规则在Lambda表达式中指定,最终生成一个新的集合

  • 举个例子,这里我们希望让所有字符串都变成大写模式

    fun main(){
        val list= listOf("APPle","mad","internet")
        val newlist=list.map{it.toUpperCase()}
        for(m in newlist){
            println(m)
        }
    }

    map函数功能非常强大,这里只是简单举例

filter函数

filter函数是用来过滤集合中的数据的,它可以单独使用,也可以配合map函数一起使用

  • 举个例子,我们现在只需要保留5个字母以内的字符串,此时就可以借助filter函数功能实现

    fun main(){
        val list= listOf("APPle","mad","internet")
        val newlist=list.filter{it.length<=5}
        for(m in newlist){
            printf(m)
        }
    }
any函数和all函数
  • any函数

    用于判断集合中是否至少存在一个元素满足指定条件

     

    fun main(){
        val list= listOf("APPle","mad","internet")
        val anyResultt=list.any{it.length<=5}
    }
    //输出结果为true
  • all函数

    用于判读集合中是否所有元素都满足指定条件

    fun main(){
        val list= listOf("APPle","mad","internet")
        val anyResult=list.all{it.length<=5}
    }
    //输出结果为false

需要注意的一点是这两种函数式API输出的值表现为布尔类型,也就是说输出结果为 true 或者 false.

 



这篇关于Lambda编程(kotlin)(上)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程