Kotlin学习——kt里的作用域函数scope function,let,run,with,apply,also

Kotlin 是一门现代但已成熟的编程语言,旨在让开发人员更幸福快乐。 它简洁、安全、可与 Java 及其他语言互操作,并提供了多种方式在多个平台间复用代码,以实现高效编程。

https://play.kotlinlang.org/byExample/01_introduction/02_Functions

其他关于kt的博客文章如下:

目录

  • 引出
    • let
    • run
    • with
    • [apply 类似set方法](#apply 类似set方法)
    • [also 打印日志](#also 打印日志)
  • 总结

引出


1.Kotlin标准库函数let可用于作用域和null检查;

2.执行一个代码块并返回其结果。不同的是,在run函数中,对象是通过 this 访问的;

3.with是一个非扩展函数,可以简洁地访问其参数的成员:在引用其成员时可以省略实例名称;

4.apply在对象上执行一个代码块,并返回对象本身;

5.also工作原理与apply类似:它执行给定的块并返回调用的对象。在块内部,对象被它引用,日志打印;

let

Kotlin标准库函数let可用于作用域和null检查。当对对象调用时,let执行给定的代码块并返回其最后一个表达式的结果。可以通过参照对象(默认情况下)或自定义名称在块内部访问对象。

java 复制代码
package com.tianju.kt.scopeFunc

fun customPrint(s: String) {
    print(s.uppercase())
}


fun main() {
    val empty = "test".let {
        customPrint(it)
        it.isEmpty()
    }

    // TEST is empty false
    println(" is empty $empty")


    // Printing "null":
    // Printing "my string":
    //	MY STRING
    fun printNonNull(str: String?) {
        println("Printing \"$str\":")

        str?.let {
            print("\t")
            customPrint(it)
            println()
        }
    }

    // FIRST : SECOND
    fun printIfBothNonNull(strOne: String?, strTwo: String?) {
        strOne?.let { firstString ->
            strTwo?.let { secondString ->
                customPrint("$firstString : $secondString")
                println()
            }
        }
    }

    printNonNull(null)
    printNonNull("my string")
    printIfBothNonNull("First","Second")
}

run

与let一样,run是标准库中的另一个作用域函数。基本上,它也是这样做的:执行一个代码块并返回其结果。不同的是,在run函数中,对象是通过 this 访问的。当您想调用对象的方法而不是将其作为参数传递时,这很有用。

java 复制代码
package com.tianju.kt.scopeFunc

fun main() {
    fun getNullableLength(ns: String?) {
        println("for \"$ns\":")
        ns?.run {
            // 访问对象的成员时不使用其名称
            println("\tis empty? " + isEmpty())
            println("\tlength = $length")
            this.length
        }
    }
    getNullableLength(null)
    getNullableLength("")
    getNullableLength("some string with Kotlin")
}

with

with是一个非扩展函数,可以简洁地访问其参数的成员:在引用其成员时可以省略实例名称。

java 复制代码
package com.tianju.kt.scopeFunc

class Configuration(var host: String, var port: Int)

fun main() {
    val configuration = Configuration(host = "127.0.0.1", port = 9000)

    // 在引用其成员时可以省略实例名称
    with(configuration) {
        println("$host:$port")
    }

    // instead of:
    println("${configuration.host}:${configuration.port}")
}

apply 类似set方法

apply在对象上执行一个代码块,并返回对象本身。在块内部,对象被此引用。此函数用于初始化对象非常方便。

类似java里面new 对象后,进行set值

java 复制代码
package com.tianju.kt.scopeFunc

/**
 * 数据类
 */
data class Person(var name: String, var age: Int, var about: String) {
    // 构造方法有默认值
    constructor() : this("", 0, "")
}

fun main() {
    val jake = Person()
    println(jake)
    val stringDescription = jake.apply {
        name = "Jake"
        age = 30
        about = "Android developer"
    }.toString()
    println(stringDescription)
}

also 打印日志

also工作原理与apply类似:它执行给定的块并返回调用的对象。在块内部,对象被它引用,因此更容易将其作为参数传递。此函数便于嵌入其他操作,可以用于打印日志

java 复制代码
package com.tianju.kt.scopeFunc

data class PersonP(var name: String, var age: Int, var about: String) {
    constructor() : this("", 0, "")
}

fun writeCreationLog(p: PersonP) {
    println("A new person ${p.name} was created.")
}

fun main() {
    val jake = PersonP("Jake", 30, "Android developer")
        .also {
            writeCreationLog(it)
        }

    println(jake)
}

总结

1.Kotlin标准库函数let可用于作用域和null检查;

2.执行一个代码块并返回其结果。不同的是,在run函数中,对象是通过 this 访问的;

3.with是一个非扩展函数,可以简洁地访问其参数的成员:在引用其成员时可以省略实例名称;

4.apply在对象上执行一个代码块,并返回对象本身;

5.also工作原理与apply类似:它执行给定的块并返回调用的对象。在块内部,对象被它引用,日志打印;

相关推荐
西瓜堆2 小时前
提示词工程学习笔记: 工程技术行业提示词推荐
笔记·学习
LawrenceLan2 小时前
Flutter 零基础入门(十一):空安全(Null Safety)基础
开发语言·flutter·dart
txinyu的博客2 小时前
解析业务层的key冲突问题
开发语言·c++·分布式
码不停蹄Zzz2 小时前
C语言第1章
c语言·开发语言
行者963 小时前
Flutter跨平台开发在OpenHarmony上的评分组件实现与优化
开发语言·flutter·harmonyos·鸿蒙
阿蒙Amon3 小时前
C#每日面试题-Array和ArrayList的区别
java·开发语言·c#
SmartRadio3 小时前
ESP32添加修改蓝牙名称和获取蓝牙连接状态的AT命令-完整UART BLE服务功能后的完整`main.c`代码
c语言·开发语言·c++·esp32·ble
且去填词4 小时前
Go 语言的“反叛”——为什么少即是多?
开发语言·后端·面试·go
知乎的哥廷根数学学派4 小时前
基于生成对抗U-Net混合架构的隧道衬砌缺陷地质雷达数据智能反演与成像方法(以模拟信号为例,Pytorch)
开发语言·人工智能·pytorch·python·深度学习·机器学习
yeziyfx5 小时前
kotlin中 ?:的用法
android·开发语言·kotlin