Lambda编程(kotlin)(上) - Kotlin教程

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

Lambda编程

集合

集合的创建与遍历

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

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

(1)List集合

fun main(){    val list=listOf("a","b")    for(num in list){        println(num)   }}(2)Set集合

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

fun main(){    val set=setOf("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()    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()    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("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("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)}其他几种常用的函数式APImap函数

集合中的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)(上)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持

文章版权声明:除非注明,否则均为 谢士广博客 原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
AddoilApplauseBadlaughBombCoffeeFabulousFacepalmFecesFrownHeyhaInsidiousKeepFightingNoProbPigHeadShockedSinistersmileSlapSocialSweatTolaughWatermelonWittyWowYeahYellowdog
评论列表 (暂无评论,8951人围观)

还没有评论,来说两句吧...

目录[+]