Kotlin学习(4)Lambda

Lanbda基础

/*
*Lambda允许把代码块当作参数传递给函数
*/
fun a(plus:(Int,Int)->Unit){
     plus(1,2) //声明函数的地方,调用代码块,在这里传参
}

//在调用函数的地方,写代码块的实现
fun main(args: Array<String>) {
    a({a1,a2->
        println(a1+a2)   //在这里操作参数
    })
}

/*
*如果这个代码块是最后一个参数,可以把大括号写在圆括号外面
*/
 a(){a1,a2->
       println(a1+a2)   //在这里操作参数
 }

/*
*如果这个代码块是唯一的参数,可以省略括号
*/
a{a1,a2->
       println(a1+a2)   //在这里操作参数
 }

/*
*如果代码块的参数只有一个a1,那么这个参数也可以省略,默认为it
*/
a{
       println(it)   //在这里操作参数
 }

Lambda对集合的操作

val list= arrayListOf(1,2,4,5,6,7,8)

//foreach遍历,这里省略了参数
>>>   list.forEach{
>>>     println("${it}  ")
>>>   }
1  2  4  5  6  7  8

//filter  只保留符合条件的数据
>>>println( list.filter { it>3 } )
[4,5,6,7,8]

//map   得到操作后的数据
>>>println( list.map { it>*it } )
[1, 4, 16, 25, 36, 49, 64]

//all 判断集合内数据是否全都符合
>>>println( list.all { it>3 } )
false

//any 判断集合是否至少存在一个符合条件的值
>>>println( list.any { it>5 } )
true

//find 找到符合条件的第一个数据
>>>println( list.find { it>5 } )
6

//count 找到符合条件的数据数量
>>>println( list.find { it>7 } )
1

//可以链式调用,如 找到it+1 之后,是偶数的数据
>>>println( list.map { it+1 }.filter{ it%2==0 } )
[2, 6, 8]

//上面的链式调用,其实把map的结果保存一次之后,再进行filter,在保存filter结果,其实保存了两次,可以把初始集合转换成序列,提高效率
list.asSequence()
     .map { it+1 }
     .filter{ it%2==0 }

带接收者的Lambda:with和apply

/*
*正常打印A到Z的函数,会重复写result很多次
*/
fun alphabet():String{
    val result=StringBuilder()
    for(i in 'A'..'Z'){
         result.append(i)
    }
    result.append("
 end!")
    return result.toString()
}

/*
*使用with来重构,with可以接收str对象,Lambda里面的代码块可以省略str,最后一行作为返回值
*/
fun alphabet():String{
    val str=StringBuilder()
    return with(str){
         for(i in 'A'..'Z'){
            this.append(i)   //可以用this显式调用,也可以省略
         }
         append("
 end!")
         toString()
    }
}

/*
*使用apply来重构,它把调用apply的对象作为接收对象进行操作
*/
fun alphabet():String{
   return StringBuilder().apply{
         for(i in 'A'..'Z'){
             append(i)
         }
         append("
 end!")
    }.toString()
}
原文地址:https://www.cnblogs.com/liumaowu/p/9402332.html