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<P1,P2..PN,R>
processTheAnwser( new Function1<Integer,Integer>(){
public Integer invoke(Integer number){
return number+1;
}
})
- 返回函数的函数
fun foo(): (Int) -> Int = { it }
foo()(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<Person>){
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{
this@sb.append(this.toString())
}
})
- 匿名函数的返回
fun lookForAlice(people: List<Person>){
people.forEach(fun(person){ //使用标签标记
if (person.name = "Alice") {
println("Found Alice")
return // 这里返回的是 fun(person) 这个匿名函数
}
})
}