美文网首页
高阶函数

高阶函数

作者: GaoXiaoGao | 来源:发表于2020-12-18 09:07 被阅读0次

    1.forEach函数

    -示例1

    /**
     * 以下为自己定义的函数
     * (String> -> Unit 函数类型  参数为字符串  返回值是Unit
     */
    
     var print = fun  (name:String):Unit{
        println(name)
    }
    
    fun main(args:Array<String>) {
    
        var names = listOf<String>("tom","jerry","lucy")
    
        //1.forEach函数接收的是一个函数
        //forEach函数的定义如下
        /**
        @kotlin.internal.HidesMembers
        public inline fun <T> Iterable<T>.forEach(action: (T) -> Unit): Unit {
        for (element in this) action(element)
        }
         */
        //2. action 的作用是将每一个值传到函数中
        names.forEach(print) //print是一个函数
    }
    

    -示例2
    可以在forEach后面直接写一个{} 括号中定义匿名函数,简化写法

    fun main(args:Array<String>) {
    
        var names = listOf<String>("tom","jerry","lucy")
    
        //1.forEach函数接收的是一个函数
        //2. 可以在forEach后面直接写一个{} 括号中定义匿名函数
        names.forEach{
            a -> println(a)
        }
    }
    
    

    -示例3
    forEach函数中默认有一个参数 it 可以直接使用

    fun main(args:Array<String>) {
    
        var names = listOf<String>("tom","jerry","lucy")
        //1.forEach函数接收的是一个函数
        //2. 可以在forEach后面直接写一个{} 括号中定义匿名函数
        names.forEach{
            println(it)
        }
    }
    

    2.在kotlin中创建图片

    import java.awt.image.BufferedImage
    import java.io.File
    import javax.imageio.ImageIO
    
    fun main(args:Array<String>) {
    
        //在内存中创建宽高为100的图片
        var image = BufferedImage(100,100,BufferedImage.TYPE_INT_RGB)
        var w = 0.. 99; //图片的宽
        var h = 0.. 99;  //图片的高
    
        image.apply {
    
            for(i in w){
                for(j in h){
                    setRGB(i,j,0xff0000)
                }
            }
        }
    
        //图片保存到文件中
        ImageIO.write(image,"bmp", File("a.bmp"))
    }
    

    3. maxBy函数

    有以下数据

     var 选手数据库 = listOf<Girl>(
        Person("选手1",18,167,"山东"),
        Person("选手2",19,167,"广东"),
        Person("选手3",16,166,"湖南"),
        Person("选手4",17,167,"浙江"),
        Person("选手5",17,165,"四川"),
        Person("选手6",19,167,"山西"),
        Person("选手7",18,167,"陕西"),
        Person("选手8",15,165,"西藏"),
        Person("选手9",19,167,"河北"),
        Person("选手10",18,169,"甘肃")
    )
    

    -在kotlin中筛选出年龄最大的选手,使用函数maxBy

        //返回的是集合
        println(选手数据库.maxBy { it.age });
    

    4. filter函数

    -使用多个条件过滤选手,使用filter函数

        println(选手数据库.filter { (it.age>16) and (it.address=="山东") });
    

    5. map函数

    -从数据中按属性重新组成集合,使用map函数

    //取出集合中 以age和address组成的新的集合并返回
    println(选手数据库.map { "${it.age}: ${it.address}" });
    //[18: 山东, 19: 广东, 16: 湖南, 17: 浙江, 17: 四川, 19: 山西, 18: 陕西]
    

    6. any函数

    -查看数据中是否有符合条件的数据,使用any函数

    // any 返回Boolean 类型,查看数据中是否有符合条件的
    println(选手数据库.any { it.age>16 });
    

    7. count函数

    -统计符合条件的数据量,使用count函数

      // count 返回个数,统计符合条件的数据
      println(选手数据库.count { it.age>16 });
    

    8. find函数

    -返回第 1 条符合条件的数据,使用find函数

     // find 返回第一条符合条件的数据
      println(选手数据库.find { it.age==16 });
    

    9. groupBy 函数

    -对数据进行分组并返回,使用groupBy 函数

       println(选手数据库.groupBy { it.address });
      //{山东=[Person(name=选手1, age=18, height=167, address=山东)], 广东=[Person(name=选手2, age=19, height=167, address=广东)]}
    
    // 筛选某一组的人并打印   ?是有可能数据是空
       选手数据库.groupBy { it.address }.get("山东")?.forEach { println(it) }
    
    

    10. DSL

    -扩展函数
    有以下数据及扩展的方法

    data class Person(var name:String,var age:Int, var height:Int, var address:String)
    
    //模拟选手信息
      var 选手数据库 = listOf<Person>(
        Person("选手1",18,167,"山东"),
        Person("选手2",19,167,"广东"),
        Person("选手3",16,166,"湖南"),
        Person("选手4",17,167,"浙江"),
        Person("选手5",17,165,"四川"),
        Person("选手6",19,167,"山西"),
        Person("选手7",18,167,"陕西"),
        Person("选手8",15,165,"西藏"),
        Person("选手9",19,167,"河北"),
        Person("选手10",18,169,"甘肃")
    )
    
    //扩展的方法
    fun List<Person>.查找年龄小于17的(age: Int){
        filter { it.age < age }.forEach(::println)
    }
    

    调用的时候

       选手数据库.查找年龄小于17的(17)
       //输出结果
       Person(name=选手3, age=16, height=166, address=湖南)
       Person(name=选手8, age=15, height=165, address=西藏)
    

    -采用中缀表达式 (infix 关键字),进一步简化

    //采用中缀表达式简化
    infix fun List<Person>.查找年龄小于16的(age: Int){
        filter { it.age < age }.forEach(::println)
    }
    

    调用的时候

    //调用中缀表达式的函数,中间有空格分隔就可以调用
    选手数据库 查找年龄小于16的 16
    
    //输出结果
    Person(name=选手8, age=15, height=165, address=西藏)
    
    

    相关文章

      网友评论

          本文标题:高阶函数

          本文链接:https://www.haomeiwen.com/subject/dxmzgktx.html