IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Kotlin 学习 with run 和apply -> 正文阅读

[移动开发]Kotlin 学习 with run 和apply

摘自第一行Android代码第3版

标准函数 with

with函数接收两个参数:第一个参数可以是一个任意类型的对象,第二个参数是一个Lambda表达式。with函数会在Lambda表达式中提供第一个参数对象的上下文,并使用Lambda表达式中的最后一行代码作为返回值

让我们来看一个例子

比如有一个水果列表,现在我们想要吃完所有水果,并将结果打印出来,就可以这样写

package com.example.activitytest

import java.lang.StringBuilder

/**
 * Create with IntelliJ IDEA.
 * Description:
 * User: coco
 * Date: 2022-01-02
 * Time: 10:50
 */
 
fun main(){
	val list = listOf("Apple","Banana","Orange","Pear","Grape")
	val builder = StringBuilder()
	builder.append("Start eating fruits.\n")
	for (fruit in list){
		builder.append(fruit).append("\n")
	}
	builder.append("Ate all fruits.")
	val result = builder.toString()
	print(result)
}

输出如下:

Start eating fruits.
Apple
Banana
Orange
Pear
Grape
Ate all fruits.

实际应用

自习观察,不会发现我们连续调用了很多次builder对象的方法。其实这个时候就可以使用with函数来让代码变得更加精简

fun main() {
	val list = listOf("Apple","Banana","Orange","Pear","Grape")
	val result = with(StringBuilder()){
		append("Start eating fruits.\n")
		for (fruit in list){
			append(fruit).append("\n")
		}
		append("Ate all fruits.")
		toString()
	}
	println(result)
}

输出如下

Start eating fruits.
Apple
Banana
Orange
Pear
Grape
Ate all fruits.

首先我们给with函数的第一个参数传入了一个StringBuilder对象,那么接下来整个Lambda表达式的上下文就会是这个StringBuilder对象。于是我们在Lambda表达式中就不会在像刚才那样调用builder.append()和builder.toString()方法了,而是可以直接调用append()和toString()方法。Lambda表达式的最后一行代码会作为with函数的返回值返回

标准函数 run

run 函数的用法和使用场景其实和with函数是非常类似的,只是稍微做了一些语法改动而已。首先run函数通常不会直接调用,而是要在某个对象的基础上调用;其次run函数只接收一个Lambda函数,并且会在Lambda表达式中提供调用对象的上下文。其他方面和with函数是一样的,包过也会使用一些Lambda表达式中的最后一行作为返回值返回

使用run 改写

fun main() {
	val list = listOf("Apple", "Orange", "Pear", "Grape")
	val result = StringBuilder().run() {
		append("Start eating fruits.\n")
		for (fruit in list) {
			append(fruit).append("\n")
		}
		append("Ate all fruits.")
		toString()
	}
	println(result)
}

输出结果

Start eating fruits.
Apple
Orange
Pear
Grape
Ate all fruits.

总体来说变化非常小,只是将调用with函数并传入StringBuilder对象改成了调用StringBuilder对象的run方法,其他没有任何区别

标准函数apply

apply函数和run函数也是极其类似的,都要在某个对象上调用,并且只接收一个Lambda参数,也会在Lambda表达式中提供调用对象的上下文,但是apply函数无法指定返回值,而是会自动返回调用对象本身

使用apply 改写

fun main() {
	val list = listOf("Apple", "Orange", "Pear", "Grape")
	val result = StringBuilder().apply {
		append("Start eating fruits.\n")
		for (fruit in list) {
			append(fruit).append("\n")
		}
		append("Ate all fruits.")
	}
	println(result.toString())
}

输出结果

Start eating fruits.
Apple
Orange
Pear
Grape
Ate all fruits.

由于apply函数无法指定返回值,只能返回调用对象本身,因此这里的result实际上是一个Stringbu对象,所以我们在最后打印的时候还要在调用它的toString()方法才行。

改写Intent 参数传递方法

companion object {
		fun actionStart(context: Context, data1: String, data2: String) {
			val intent = Intent(context, SecondActivity::class.java).apply {
				putExtra("param1", data1)
				putExtra("param2", data2)
			}
			context.startActivity(intent)
		}
	}
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-01-03 16:13:34  更:2022-01-03 16:15:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:26:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码