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.

 

posted @ 2022-03-05 13:48  单身万岁  阅读(68)  评论(0)    收藏  举报