【2023】Kotlin教程 第二篇 面向对象与函数式编程 第13章 函数式编程基石——高阶函数和Lambda表达式 13.5 内联函数 13.5.2 使用let函数

【2023】Kotlin教程

在这里插入图片描述

第二篇 面向对象与函数式编程

第13章 函数式编程基石——高阶函数和Lambda表达式

函数式编程思想虽然与面向对象一样立即悠久,但是支持函数式编程的计算机语言不过是近几年的事情。这些语言有Swift、Python、Java 8和C++ 11等,作为新生的语言Kotlin也支持函数式编程。

13.5 内联函数

在高阶函数中参数如果是函数类型,则可以接收Lambda表达式,而Lambda表达式在编译时被编译成为一个匿名类,每次调用函数时都会创建一个对象,如果这种被函数反复调用则创建很多对象,会带来运行时额外开销。

为了解决此问题,在Kotlin中可以将这种函数声明为内联函数。

【提示】 内联函数在编译时不会生成函数调用代码,而是用函数体中实际代码替换每次调用函数。

13.5.2 使用let函数

在Kotlin中一个函数参数被声明为非空类型时,也可以接收可空类型的参数,但是如果实际参数如果真的为空,可能会导致比较严重的问题。因此需要在参数传递之前判断可空参数是否为非空,示例代码如下:

fun square(num: Int): Int = num * num

fun main() {
    
    

    val n1: Int? = 10 // null

    // 自己进行非空判断
    if (n1 != null) {
    
    
        println(square(n1))
    }
}

在这里插入图片描述

函数square 的参数是非空整数类型,函数实现一个整数的平方运算。

if (n1 != null) 判断n1 是否为非空,非空才调用。

自己判断一个对象非空比较麻烦。在Kotlin中任何对象都可以使用一个let函数,Iet函数后面尾随一个Lambda表达式,在对象非空时执行Lambda表达式中的代码,为空时则不执行。如下:

fun square(num: Int): Int = num * num

fun main() {
    
    

    val n1: Int? = 10 // null

    n1?.let {
    
     n -> println(square(n)) }
    n1?.let {
    
     println(square(it)) }

}

在这里插入图片描述

这两行代码都是使用let函数进行调用效果是一样的,当n1非空时执行Lambda表达式中的代码,如果n1为空则不执行。n1?.let{println(square(it)}语句是省略了参数声明,使用隐式参数it替代参数n。

猜你喜欢

转载自blog.csdn.net/weixin_44226181/article/details/130024508
今日推荐