栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Kotlin 学习 with run 和apply

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Kotlin 学习 with run 和apply

摘自第一行Android代码第3版

标准函数 with

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

让我们来看一个例子

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

package com.example.activitytest

import java.lang.StringBuilder


 
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)
		}
	}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/692041.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号