Kotlin基础语法(三)


文章目录

  • Kotlin基础语法(三)
  • 柯里化
  • 柯⾥化与Lambda演算
  • 扩展函数
  • 面向表达式编程
  • Kotlin中的?:符号


柯里化

⾼阶函数在Kotlin中另⼀⽅⾯的表现,即⼀个函数返回另⼀个函数作为结果。

fun foo(x:Int)={y:Int->x+y}

javascript 柯里化函数 kotlin柯里化_java

fun foo(x:Int): (Int) ->Int {
    return { y:Int->x+y}
}
// 执行foo函数返回 (Int) ->Int 函数
//柯⾥化(Currying)的语法,其实它就是函数作为返回值的⼀种典型的应⽤。

柯⾥化指的是把接收多个参数的函数变换成⼀系列仅接收单⼀参数函数的过程,在返回最终结果值之前,前⾯的函数依次接收单个参数,然后返回下⼀个新的函数。

// 拿我们最熟悉的加法举例子:
fun sum(x:Int,y:Int,z:Int) = x+y+z
// 等价于:
fun sum(x: Int) = { y: Int ->
    { z: Int ->
        x + y + z
    }
}
// print(sum(1)(2)(3))=6
// 柯里化类似击鼓传花

柯⾥化与Lambda演算

Lambda演算是函数式语⾔的理论基础。在严格遵守这套理论的设计中,所有的函数都只能接收最多⼀个参数。为了解决多参数的问题,Haskell Curry引⼊了柯⾥化这种⽅法。说到底,柯⾥化是为了简化Lambda演算理论中函数接收多参数⽽出现的,它简化了理论,将多元函数变成了⼀元。然⽽,在实际⼯程中,Kotlin等语⾔并不存在这种问题,因为它们的函数都可以接收多个参数进⾏计算。虽然柯⾥化在⼯程中并没有⼤规模的应⽤,然⽽在某些情况下确实起到了某种奇效,如Lambda的特殊语法:

如果⼀个函数只有⼀个参数,且该参数为函数类型,那么在调⽤ 该函数时,外⾯的括号就可以省略,例如:

fun omitParentheses(block: () -> Unit) {
    block()
}
fun main(){
    print(omitParentheses { println("I Love Kotlin") })
}

如果参数不⽌⼀个,且最后⼀个参数为函数类型时,就可以采⽤类似柯⾥化风格的调⽤:

fun main(){
    curryingLike("looks like currying style") {
        println(it)
    }
}

fun curryingLike(content: String, block: (String) -> Unit) {
    block(content)
}
// 输出:
// looks like currying style
/*curryingLike("looks like currying style") {
        println(it)
    }*/
    /*等价于*/
    curryingLike("looks like currying style",{
        println(it)
    })

扩展函数

Kotlin中的扩展函数允许我们在不修改已有类的前提下,给它增加新的⽅法。

javascript 柯里化函数 kotlin柯里化_javascript 柯里化函数_02


javascript 柯里化函数 kotlin柯里化_Kotlin_03

面向表达式编程

几种常见的表达式:
·if表达式
·函数体表达式
·Lambda表达式
·函数引⽤表达式

表达式可以是⼀个值、常量、变量、操作符、函数,或它们之间的组合,编程语⾔对其进⾏解释和计算,以求产⽣另⼀个值。

1//单纯的字⾯量表达式,值为1 -1//增加前缀操作符,值为-1
1+1//加法操作符,返回2
listOf(1,2,3)//列表表达式
"kotlin".length//值为6
{x:Int->x+1} //Lambda表达式,类型为(Int)->Int
fun(x:Int){println(x)}//匿名函数表达式,类型为(Int)->Unit
if(x>1)xelse1 //if-else表达式,类型为Int,假设x已赋值

Kotlin中的?:符号

虽然Kotlin没有采⽤三元运算符,然⽽它存在⼀个很像的语法?: 。注意,这⾥的问号和冒号必须放在⼀起使⽤,它被叫作Elvis运算符,或者null合并运算符。由于Kotlin可以⽤“?”来表⽰⼀种类型的可空性,我们可以⽤“?:”来给⼀种可空类型的变量指定为空情况下的值,它有点类似Scala中的getOrElse⽅法。你可以通过以下的例⼦理解Elvis运算符:

val maybeInt:Int?=null
print(maybeInt?:1)
>>> 1