高阶函数

2020-12-18  本文已影响0人  GaoXiaoGao

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=西藏)

上一篇 下一篇

猜你喜欢

热点阅读