Kotlin实战学习笔记(八 高阶函数)

1.声明高阶函数

  • kotlin
val sum = { x: Int,y: Int -> x+y }
val sum : (Int,Int) -> Int = { x: Int,y: Int -> x+y } //完整写法
var canReturnNull: (Int,Int) -> Int? = { null } // lambda返回值可空
var funOrNull((Int,Int) -> Int)? = null // 函数返回值可空
fun String.filter(predicate: (char) -> Boolean) : String { //完整高阶函数
   if(predicate(...)) {
  }
   return ""
}
  • Java-Kotlin
fun processTheAnswer(f: (Int) -> Int)
/* Java8 */
processTheAnwser( number -> number+1)
/* Java */
//Kotlin - Java : FunctionN  
processTheAnwser( new Function1(){
    public Integer invoke(Integer number){
        return number+1;
    }
})
  • 返回函数的函数
fun foo(): (Int) -> Int = { it } 
foo()(1) // 1
  1. 内联函数 // 代码生成到class文件中不会造成额外开销
  • 当有提升lambda性能的强烈性能时使用inline关键字生成内联函数(函数的lambda参数的代码会生成到函数中)
  • 当大量数据处理是采用集合的asSquence
inline fun foo(lambda1:(Int) -> Int, noinline lambda2:( Int )->Int){ //noinline可以让该参数不用内联
      lambda1(1)
      return foo1(lambda2) //未被调用的lambda不能内联,否则无法编译
 }
  • Java的synchronized{} 对应 kotlin的Lock().withLock{}
  • java7的try-with-resouce kotlin可以用use函数代替 //use是内联函数
/*java*/
String readFirstLineFromFile(String path) throws IOException{
    try (BufferedReader br = new BufferedReader(new FileReader(path)){
     return  br.readLine()     
   }
}
/*kotlin*/
fun readFirstLineFromFile(path: String) : String {
    BufferedReader(FileReader(path)).use{ br ->
        return br.readLine()
    }
}
  • 内联函数的return
fun lookForAlice(people: List){
      people.forEach label@{ //使用标签标记
          if (it.name = "Alice") { 
              println("Found Alice")
              return     //这里返回的是lookForAlice函数,在非内联函数不是这样
              // return@label //这里返回的是lambda函数
                        ====
              // return@forEach //使用该方式 label@ 不能声明
          }
      }
}
  • this中标签的使用
println(StringBuilder().apply sb@{
    listOf("1","2","3").apply{
          [email protected](this.toString())
    }
})
  • 匿名函数的返回
fun lookForAlice(people: List){
      people.forEach(fun(person){ //使用标签标记
          if (person.name = "Alice") { 
              println("Found Alice")
              return     // 这里返回的是 fun(person) 这个匿名函数
          }
      })
}

你可能感兴趣的:(Kotlin实战学习笔记(八 高阶函数))