Kotlin-高阶函数(2019-01-16)

高阶函数

高阶函数可以将函数作为参数或者是返回值

  • forEach
    提供遍历集合的功能,forEach其实是IntArray类的扩展方法,它接受一个(Int)-> Unit的lambda表达式并且使用for循环对集合中的每个对象都做action操作。
  • map
    通常用于集合的映射
    val oldList = listOf(1, 2, 3, 4, 5)
    val newList = ArrayList()
    //遍历并处理数据源的每一条数据
    val newList1 = oldList.map {
      it * 2 + 3
    }
    //还可用于集合的转换
    val newList2 = oldList.map(Int::toDouble)
    
  • flatMap
    通常用于扁平化集合,是一种支持二维集合映射的高阶函数
    val list = listOf(
          1..20,
          2..5,
          3..4
    )
    val newList3 = list.flatMap {
        it
    }
    //结合map进行一些数据的变换
    val newList4 = list.flatMap {
      it.map {
          "NO.$it"
      }
    }
    
  • reduce
    通常用于求和
    var sum = oldList.reduce { acc, i -> acc + i }
    
  • fold
    用于求和并加上一个初始值
    sum = (1..5).fold(5) { acc, i -> acc + i }
    
  • filter
    用于过滤数据集合
    val newList5 = oldList.filter {
      //过滤条件
      it == 2 || it == 4
    }
    
  • takeWhile
    用于带有条件的循环遍历
    val res = oldList.takeWhile {
      //当元素等于2的时候结束循环
      it != 2
    }
    
  • let,apply,with
    简化代码,直接可以在lambda函数中使用对象的属性和方法
     p?.let {
          println(it.name)
          println(it.age)
          it.work()
      }
    //---------------
     p?.apply {
          println(name)
          println(age)
          work()
      }
    //-------------------
    with(BufferedReader(FileReader("test.txt"))) {
      var line: String?
      while (true) {
          line = readLine() ?: break
          println(line)
      }
      close()
    }
    
    
  • use
    use是针对那些实现了Closable接口的对象的扩展方法,也就是大部分的IO操作相关类会有这个扩展高阶方法
    在try中调用block针对Closable对象的操作,如果发生了异常会记录并抛出异常,finlly中不管有没有出异常都会自动做关闭操作,避免了IO处理的try..catch..finally样板代码。
    val file = File("test.txt")
    val bufferReader = BufferedReader(FileReader(file))
    bufferReader.use {
        it.readLine()
    }
    

本文仅作为个人学习记录
参考文章:简Kotlin 之旅5

你可能感兴趣的:(Kotlin-高阶函数(2019-01-16))