Kotlin作用域函数使用示例详细介绍

目录
  • 1 let
  • 2 run
  • 3 with
  • 4 apply
  • 5 also

这里我们将介绍Kotlin 5个作用域函数:let,run,with,apply,also。

1 let

let 可用于范围界定和空值检查。在对象上调用时,let 执行给定的代码块并返回其最后一个表达式的结果。对象可通过引用它(默认情况下)或自定义名称在块内进行访问。

所以,总结起来,let 有如下三大特征:

// 重点11:使用it替代object对象去访问其公有的属性 & 方法
object.let{
   it.todo()
}
// 重点2:判断object为null的操作
object?.let{//表示object不为null的条件下,才会去执行let函数体
   it.todo()
}
// 重点3:返回值 = 最后一行 / return的表达式

下面是一些例子(我们可以直接在 Kotlin Playground 中运行):

fun customPrint(s: String) {
    print(s.uppercase())
}
fun main() {
    val empty = "test".let {               // Calls the given block on the result on the string "test".
        customPrint(it)                    // 这里的 it 就是 "test",所以 "test" 作为输入给到 customPrint 函数中,打印出大写的 "test"
        it.isEmpty()                       // let 最后返回的是这个,也就是 empty 最终的值是 false
    }
    println(" is empty: $empty")           // 打印结果 TEST is empty: false。这里的 TEST 是 customPrint 函数 的打印结果。注意 print 和 println 的区别
    fun printNonNull(str: String?) {
        println("Printing \"$str\":")
        str?.let {                         // object不为null的条件下,才会去执行let函数体
            print("\t")
            customPrint(it)
            println()                      // 换行。let最后返回的是这一行
        }
    }
    fun printIfBothNonNull(strOne: String?, strTwo: String?) {
        strOne?.let { firstString ->
            strTwo?.let { secondString ->
                customPrint("$firstString : $secondString")
                println()
            }
        }
    }
    printNonNull(null)                    // 打印 Printing "null":
    printNonNull("my string")             // 打印 Printing "my string":
	                                      // MY STRING
    printIfBothNonNull("First","Second")  // 打印 FIRST : SECOND
}

从另一个方面,我们来比对一下不使用 let 和使用 let 函数的区别。

// 使用kotlin(无使用let函数)
mVar?.function1()
mVar?.function2()
mVar?.function3()
// 使用kotlin(使用let函数)
// 方便了统一判空的处理 & 确定了mVar变量的作用域
mVar?.let {
       it.function1()
       it.function2()
       it.function3()
}

2 run

与 let 函数类似,run 函数也返回最后一条语句。另一方面,与 let 不同,运行函数不支持 it 关键字。所以,run 的作用可以是:

  • 调用同一个对象的多个方法 / 属性时,可以省去对象名重复,直接调用方法名 / 属性即可
  • 定义一个变量在特定作用域内
  • 统一做判空处理

下面是一些例子:

fun main() {
    fun getNullableLength(ns: String?) {
        println("for \"$ns\":")
        ns?.run {                                                  // 判空处理
            println("\tis empty? " + isEmpty())                    // 这里我们就发现,在 isEmpty 前不再需要 it
            println("\tlength = $length")
            length                                                 // run returns the length of the given String if it's not null.
        }
    }
    getNullableLength(null)
    // 打印 for "null":
    getNullableLength("")
    // 打印 for "":
    //         is empty? true
    //         length = 0
    getNullableLength("some string with Kotlin")
    // 打印 for "some string with Kotlin":
    //         is empty? false
    //         length = 23
    data class People(val name: String, val age: Int)
    val people = People("carson", 25)
    people?.run{
      println("my name is $name, I am $age years old")
      // 打印:my name is carson, I am 25 years old
    }
}

3 with

with 是一个非扩展函数,可以简洁地访问其参数的成员:我们可以在引用其成员时省略实例名称。所以说,run 相当于 let 和 with 的集合。

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")   // 打印 127.0.0.1:9000
    }
    // instead of:
    println("${configuration.host}:${configuration.port}")    // 打印 127.0.0.1:9000
}

4 apply

apply 对对象执行代码块并返回对象本身。在块内部,对象由此引用。此函数对于初始化对象非常方便。所以再重复一遍,apply函数返回传入的对象的本身。

data class Person(var name: String, var age: Int, var about: String) {
    constructor() : this("", 0, "")
}
fun main() {
    val jake = Person()
    val stringDescription = jake.apply {
        // Applies the code block (next 3 lines) to the instance.
        name = "Jake"
        age = 30
        about = "Android developer"
    }.toString()
    println(stringDescription)      // 打印 Person(name=Jake, age=30, about=Android developer)
}

5 also

类似 let 函数,但区别在于返回值:

  • let 函数:返回值 = 最后一行 / return的表达式
  • also 函数:返回值 = 传入的对象的本身
// let函数
var result = mVar.let {
               it.function1()
               it.function2()
               it.function3()
               999
}
// 最终结果 = 返回999给变量result
// also函数
var result = mVar.also {
               it.function1()
               it.function2()
               it.function3()
               999
}
// 最终结果 = 返回一个mVar对象给变量result

另一个类似的例子:

data class Person(var name: String, var age: Int, var about: String) {
             constructor() : this("", 0, "")
}
fun writeCreationLog(p: Person) {
    println("A new person ${p.name} was created.")
}
fun main() {
    val jake = Person("Jake", 30, "Android developer")   // 1
        .also {                                          // 2
            writeCreationLog(it)                         // 3
        }
    println(jake)
    // 最终打印:
    // A new person Jake was created.
    // Person(name=Jake, age=30, about=Android developer)
}

到此这篇关于Kotlin作用域函数使用示例详细介绍的文章就介绍到这了,更多相关Kotlin作用域函数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Kotlin作用域函数之间的区别和使用场景详解

    作用域函数 Kotlin 的作用域函数有五种:let.run.with.apply 以及 also. 这些函数基本上做了同样的事情:在一个对象上执行一个代码块. 下面是作用域函数的典型用法: val adam = Person("Adam").apply { age = 20 city = "London" } println(adam) 如果不使用 apply 来实现,每次给新创建的对象属性赋值时就必须重复其名称. val adam = Person("

  • Kotlin作用域函数应用详细介绍

    目录 1.前置知识 2.使用 3.源码赏析 3.1 let和run 3.2 also和apply 3.3 repeat 3.4 with 4.反编译 5.小结 平时看博客或者学知识,学到的东西比较零散,没有独立的知识模块概念,而且学了之后很容易忘.于是我建立了一个自己的笔记仓库 (一个我长期维护的笔记仓库,感兴趣的可以点个star~你的star是我写作的巨大大大大的动力),将平时学到的东西都归类然后放里面,需要的时候呢也方便复习. 1.前置知识 在Kotlin中,函数是一等公民,它也是有自己的类

  • Kotlin作用域函数使用示例详细介绍

    目录 1 let 2 run 3 with 4 apply 5 also 这里我们将介绍Kotlin 5个作用域函数:let,run,with,apply,also. 1 let let 可用于范围界定和空值检查.在对象上调用时,let 执行给定的代码块并返回其最后一个表达式的结果.对象可通过引用它(默认情况下)或自定义名称在块内进行访问. 所以,总结起来,let 有如下三大特征: // 重点11:使用it替代object对象去访问其公有的属性 & 方法 object.let{ it.todo(

  • sql server数据库中raiserror函数用法的详细介绍

    sql server数据库中raiserror函数的用法 server数据库中raiserror的作用就和asp.NET中的throw new Exception一样,用于抛出一个异常或错误.这个错误可以被程序捕捉到. raiserror的常用格式如下: raiserror('错误的描述',错误的严重级别代码,错误的标识,错误的描述中的参数的值(这个可以是多个),一些其它参数),在官方上的格式描述如下: RAISERROR ( { msg_id | msg_str | @local_variab

  • Kotlin类的继承实现详细介绍

    1.在kotlin中,默认类都是封闭的closed的.如果要让某个类开放继承,必须用open关键字修饰 类中的方法默认也是关闭的.如果需要子类复写父类的方法,也必须用open修饰. 1)定义父类,用open将类继承打开.用open将函数的复写打开. //父类必须用open修饰,才能够被继承 open class Person(val name:String) { var age = 0 //父类定义的函数,必须有open修饰,子类才能复写 open fun doWork(){ println("

  • MySQL高级查询示例详细介绍

    目录 1.左关联 2.右关联 3.子查询 4.联合查询 5.分组查询 1.左关联 MySQL中的左关联(Left Join)是一种基于共同列的连接操作, 它将左侧表中的所有行与右侧表中匹配的行结合在一起, 如果右侧表中没有匹配的行,则结果集中右侧表中的所有列将显示为NULL. 左侧表是指在关键字LEFT JOIN中出现在关键字左侧的表. 下面是一个使用MySQL的LEFT JOIN进行连接操作的简单示例: 假设我们有两个表,一个是学校表(school),包含学校的ID和名称: 另一个是年级表(g

  • JAVA JNI函数的注册过程详细介绍

    JAVA JNI函数的注册过程详细介绍 我们在java中调用Native code的时候,一般是通过JNI来实现的,我们只需要在java类中加载本地.so库文件,并声明native方法,然后在需要调用的地方调用即可,至于java中native方法的具体实现,全部交给了Native层.我们要在java中正确地调用到本地代码中对应函数的前提是什么呢?答案就是通过一定的机制建立java中native方法和本地代码中函数的一一对应关系,那么这种机制是什么呢?就是JNI函数的注册机制. JNI函数的注册有

  • C语言基础函数用法示例详细解析

    目录 函数 函数定义 函数一般格式 C语言函数分类 库函数 库函数的分类 库函数的学习 自定义函数 函数的参数 实际参数 形式参数 函数的调用 传值调用 传址调用 无参函数调用 函数的声明和定义 函数的声明 函数的定义 函数声明与定义的区别 exit与return介绍 函数 函数定义 百度百科对函数的定义:子程序 在计算机科学中,子程序是一个大型程序中的某部分代码,有一个或者多个语句块组成,它负责完成某项特定的任务,而且相比于其他的代码,具备相对的独立性. 一般来说会有输入参数和返回值,提供对过

  • javascript中的变量作用域以及变量提升详细介绍

    变量作用域"一个变量的作用域表示这个变量存在的上下文.它指定了你可以访问哪些变量以及你是否有权限访问某个变量." 变量作用域分为局部作用域和全局作用域. 局部变量(处于函数级别的作用域)不像其他对面对象的编程语言(比方说C++,Java等等),javascript没有块级作用域(被花括号包围的):当是,javascript有拥有函数级别的作用域,也就是说,在一个函数内定义的变量只能在函数内部访问或者这个函数内部的函数访问(闭包除外,这个我们过几天再写个专题). 函数级别作用域的一个例子

  • C语言基础知识变量的作用域和存储方式详细介绍

    变量的作用域和存储方式 1.简述变量按作用域的分类 变量按作用域分:分为全局变量和局部变量 全局变量:在所有函数外部定义的变量叫做全局变量 全局变量的使用范围:从定义位置开始到下面整个程序结束 局部变量:在一个函数内部定义的变量或者函数的形式参数统称为局部变量 局部变量的使用范围:在函数内部定义的变量只能在本函数内部进行使用 2.简述变量按存储方式的分类 静态变量 自动变量 寄存器变量[寄存器就是cpu内部可以存储数据的一些硬件东西] 3.简述全局变量和局部变量命名冲突的问题 1>在一个函数内部

随机推荐