《第一行代码》Kotlin讲堂知识整理——第3章 标准函数和静态函数

3.7 Kotlin讲堂:标准函数和静态方法

3.7.1 标准函数with、run和apply

let标准函数的用法已经在上一章中介绍过了,不再赘述

with函数

with函数接收两个参数:第一个参数可以是一个任意参数的对象,第二个参数是一个lambda表达式。

示例代码如下:

val result = with(obj) {
	// 这里是obj的上下文
	”value“ // with函数的返回值
}

比如还是那个水果列表,现在我们要吃完所有水果,并将其打印出来

val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape", "Watermelon")
// 普通写法
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()
println(result)

来看输出

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

你会发现我们调用了很多次builder对象的方法,这个时候就可以考虑用with函数来让代码变得更加精简。

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

with写法:with函数的第一个参数就是整个lambda表达式的上下文。withrun函数返回的都是lambda表达式的最后一行代码的返回值。

很明显第二段写法能让代码简洁不少。

run函数

先来看格式:

val result = obj.run{
	// 这里是obj的上下文
	”value“ // run函数的返回值
}

可以看到run函数的用法和with函数十分类似。

首先,run函数不是直接调用的,一定要调用某个对象的run函数才行,其次run函数只接收一个lambda参数。

来看示例代码:

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

运行结果自然也是完全一致的。

apply函数

apply函数与run函数类似,但是apply函数无法指定返回值,而是会返回调用对象本身。

val result = obj.apply{
	// 这是obj的上下文
}
// result == obj

我们再来改一下吃水果这段代码

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

结果跟之前是一样的,不再演示。

实际应用场景:启动Activity。

val intent = Intent(appContext, MainActivity::class.java)
intent.putExtra("param1", "data1")
intent.putExtra("param2", "data2")
appContext.startActivity(intent)

可以用apply函数简化成:

val intent = Intent(appContext, MainActivity::class.java).apply {
    putExtra("param1", "data1")
    putExtra("param2", "data2")
}
appContext.startActivity(intent)

标准函数介绍暂告一段落。

3.7.2 定义静态方法

Kotlin中弱化了静态方法这个概念,像工具类这种功能,在Kotlin中推荐使用单例类的方式来实现。

定义单例类。

Object Util {
	fun doAction() {
		Println("do action")
	}
}

这样就能用Util.doAction()的方式来调用了。

如果我们只是希望类中的某个方法是静态的该怎么办?可以用companion object来实现,示例如下:

class Util2 {
    fun doAction1() {
        println("doAction1")
    }

    companion object {
        fun doAction2() {
            println("doAction2")
        }
    }
}

这样doAction2()就能通过Util2.doAction2()的方式来调用了。

其实doAction2()也还不是真正的静态方法,companion object这个关键字会在Util类的内部创建一个伴生类,而doAction2()就是定义在这个伴生类里面的实例方法。只是Kotlin会保证Util类始终只会存在一个伴生类对象,因此调用Util.doAction2()方法实际上就是调用了Util类中伴生对象的doAction2()方法。

这些语法特性已经基本能满足我们平时的开发需求了,如果你确实需要定义真正的静态方法,Kotlin仍然提供了两种实现方式:注解和顶层方法

class Util2 {
    fun doAction1() {
        println("doAction1")
    }

    companion object {
    	@JvmStatic
        fun doAction2() {
            println("doAction2")
        }
    }
}

只要在doAction2()方法之上加上@JvmStatic注解,那么doAction2()方法就是一个真正的静态方法了。

Kotlin会将所有的顶层方法编译成静态方法,且Kotlin中所有的顶层方法都可以在任何位置被直接调用。

Util2.kt文件中定义一个doSomething()方法,如下:

fun doSomething() {
    println("doSomething")
}

class Util2 {
    。。。
}

这样在Kotlin中就可以直接调用了,
在这里插入图片描述
在Java中使用Util2Kt.doSomething()这种格式来调用就可以了。
在这里插入图片描述

3.8 小结与评论

适当休息,继续向前。


附上文中代码地址

《第一行代码》Kotlin讲堂知识整理

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT小瓯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值