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

【2023】Kotlin教程

在这里插入图片描述

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

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

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

13.5 内联函数

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

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

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

13.5.3 使用with和apply函数

有时候需要对一个对象设置多个属性,或调用多个函数时,可以使用with或applyl函数。与let函数类似Kotlin中所有对象都可以使用这两个函数。

举个栗子:

import java.awt.BorderLayout
import javax.swing.JButton
import javax.swing.JFrame
import javax.swing.JLabel

class MyFrame(title: String) : JFrame(title) {
    
    

    init {
    
    
        // 创建标签
        val label = JLabel("Label")

        // 创建Button1
        val button1 = JButton()
        button1.text = "Button1"
        button1.toolTipText = "Button1"

        // 注册事件监听器, 监听Button1 的单击事件
        button1.addActionListener {
    
     label.text = "单击Button1" }

        // 创建Button2
        val button2 = JButton().apply {
    
    
            text = "Button2"
            toolTipText = "Button2"

            // 注册事件监听器, 监听Button2 的单击事件
            addActionListener {
    
     label.text = "单击Button2" }

            // 添加Button2 到内容面板
            contentPane.add(this, BorderLayout.SOUTH)
        }

        with(contentPane) {
    
    
            // 添加标签到内容面板
            add(label, BorderLayout.NORTH)

            // 添加Button1 到内容面板
            add(button1, BorderLayout.CENTER)

            println(height)
            println(this.width)
        }

        // 设置窗口大小
        setSize(350, 120)

        // 设置窗口可见
        isVisible = true
    }
}

fun main() {
    
    

    // 创建Frame 对象
    MyFrame("MyFrame")
}

在这里插入图片描述

上述代码是Swing的窗口,Swing是Java的用户图形界面介绍【之后我们还会说】

其中代码创建并调用Button1的属性和函数,这传统的做法,由于多次调用同一个对象的属性或函数,可以使用with或apply函数

后面创建并调用Button2的属性和函数,其中使用applyt函数,apply函数后面尾随一个Lambda表达式,需要调用的属性和函数被放到Lambda表达式中,Lambda表达式中省略的对象名button2,例如text="Button2表达式说明调用的button2的text属性,apply函数中如果引用当前对象可以使用this关键字,例如contentPane.add(this, BorderLayout..SOUTH)中的this,apply函数是有返回值的,它的返回值就是当前对象。

如果不需要返回值可以使用with函数,with函数与apply函数类似,后面也尾随一个Lambda表达式,需要调用的属性和函数被放到Lambda表达式中,with函数中如果引用当前对象也是使用this关键字。

猜你喜欢

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