zoukankan      html  css  js  c++  java
  • 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()
    }
  • 相关阅读:
    面试题19:包含min函数的栈
    编程之美 计算字符串的相似度
    android 数据持久化——I/O操作
    SSD磁盘,CPU居高不下,高并发的情况下,是不是mysql解析器耗费的cpu资源高?
    Eclipse、MyEclipse优化,提高运行速度
    Sonar入门学习
    Oracle 生成指定范围内随机日期
    ios中的GCD
    如何使用Win8系统自带杀毒软件
    安装Ubuntu版本linux过程中没有提示设置root用户密码问题的解决办法
  • 原文地址:https://www.cnblogs.com/liumaowu/p/9402332.html
Copyright © 2011-2022 走看看