Kotlin 标准函数和静态方法示例详解

目录
  • 标准函数
    • with
    • run
    • Apply
  • 定义静态方法
    • 注解
    • 顶层方法

标准函数

with

with 的作用是可以在连续调用同一对象的多个方法时让代码变得更加精简

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

看个例子,例如有一个水果列表,现在我们想吃完所有水果,并将结果打印出来

val list = listOf("Apple","Banana","Orange")
val builder = StringBuilder()
builder.append("Start eating fruits\n")
for(fruit in list){
	builder.append(fruit).append("\n")
}
builder.append("Ate all fruits.\n")
val result = builder.toString()
print(result)

Start eating fruitsApple
Banana
Orange
Ate all fruits.

我们可以使用 with 让代码更简单

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

我们给 with 函数第一个参数传入 StringBuilder 对象,那么接下来整个 Lambda 表达式的上下文就是这个 StringBuilder。Lambda 表达式最后一行代码会作为 with 函数的返回值返回

run

首先 run 函数是不能直接调用的,而是一定要调用某个对象的 run 函数才行;其次 run 函数只接收一个 Lambda 函数,并且会在 Lambda 表达式中提供调用对象的上下文

val result = obj.run{
	//这里是obj的上下文
	"value"//run函数的返回值
}
val list = listOf("Apple","Banana","Orange")
        val result = StringBuilder().run{
            append("Start eating fruit.\n")
            for (fruit in list){
                append(fruit+"\n")
            }
            append("Ate all fruits.\n")
            toString()
        }
        println(result)

Apply

apply 函数和 run 函数极其类似,只不过无法指定返回值,而是会自动返回调用对象本身

val result = obj.apply{
	//这里是obj的上下文
}
//result == obj
val list = listOf("Apple","Banana","Orange")
        val result = StringBuilder().apply{
            append("Start eating fruit.\n")
            for (fruit in list){
                append(fruit+"\n")
            }
            append("Ate all fruits.\n")
        }
        println(result.toString())

我们可以使用 apply 对启动 Activity 的代码进行优化,传递的参数越多,这种写法越有优势

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

定义静态方法

在 Java 中定义一个静态方法非常简单,只需要在方法前声明 static 关键字即可

public class Util{
	public static void doAction(){
		System.out.println("do action");
	}
}

调用的时候

Util.doActin();

静态方法非常适合编写一些工具类的功能,因为工具类通常没有创建实例的必要。而 Kotlin 中推荐使用单例类的方法来实现,例如上述 Util 工具类

object Util {
    fun doAction(){
        println("do action")
    }
}

调用的时候

Util.doAction()

不过使用单例类的写法会将整个类的所有方法全部变成类似于静态方法的调用方式,而如果我们只想让类中某个方法变成静态方法的调用方式:

class Util {
    fun doAction1(){
        println("do action1")
    }
    companion object{
        fun doAction2(){
            println("do action2")
        }
    }
}

我们将 Util 变成一个普通类,doAction1() 方法一定要创建 Util 类的实例才能调用,而 doAction2() 可以使用 Util.doAction2() 的方式调用。doAction2() 方法其实也不是静态方法,companion object 关键字实际上会在 Util 类内创建一个伴生类,而 doAction2() 方法就是定义在这个伴生类里面的实例方法,只是 Kotlin 会保证 Util 类始终只会存在一个伴生类对象,因此调用 Util.doAction2() 方法实际上就是调用了 Util 类中伴生对象的 Util.doAction2() 方法

由此可见 Kotlin 确实没有直接定义静态方法的关键字,而是提供了一些语法特性来支持类似静态方法调用的写法,然而如果你确确实实需要定义真正的静态方法,Kotlin 仍然提供了两张实现方式:注解和顶层方法

注解

如果我们给单例类或 Companion object 中的方法加上 @JvmStatic 注解,那么 Kotlin 编译器就会将这些方法编译成真正的静态方法:

class Util {
    fun doAction1(){
        println("do action1")
    }
    companion object{
        @JvmStatic
        fun doAction2(){
            println("do action2")
        }
    }
}

注意@JvmStatic注解只能加到单例类或 companion object 中方法上。由于 doAction2() 方法已经成为真正的静态方法,不管在 Kotlin 还是 Java 中都可以使用 Util.doAction2() 的写法来调用了

顶层方法

顶层方法指的是那些没有定义在任何类中的方法,例如 main() 方法。Kotlin 编译器会将所有顶层方法全部编译成静态方法。所以如果你定义了一个顶层方法,那么它就一定是静态方法

现在创建一个 Helper.kt 的 File

现在在这个文件里定义的任何方法都是顶级方法

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

所有的顶层方法都可以在任何位置被直接调用,不用管包名路径,也不用创建实例,直接输入方法名即可:doSomething()。而在 Java 中不同了。Kotlin 编译器会自动创建一个 HelperKt 的 Java 类,所以使用 HelpterKt.doSomething()即可

classJavaTest {
    public void invokeStaticMethod(){
        HelperKt . doSome thing();
    }
}

以上就是Kotlin 标准函数和静态方法示例详解的详细内容,更多关于Kotlin 标准函数静态方法的资料请关注我们其它相关文章!

(0)

相关推荐

  • kotlin快速入门之标准函数与静态方法

    目录 标准函数 with run apply 静态方法 单例类实现静态方法 伴生类实现静态方法 注解实现静态方法 顶层方法实现静态方法 总结 标准函数 首先我们介绍标准函数 with.run.apply,如果你了解javascript,那理解kotlin的标准函数width.run.apply那简直不要太轻松.with.run.apply与javascript中的with的意义基本一模一样,只是含有一些细微差别. with with它接收两个参数,第一个参数可以是任意类型的对象,第二个参数是一个

  • Kotlin使用静态变量与静态方法详解

    前言 在日常开发过程中,静态变量和  静态方法 是我们常见的用法,Java中相信大家并不陌生了,那么在 Kotlin 中该如何使用呢? 其实很简单,只需要一个将变量和方法包含在 companion object 域中即可,比如这样: class Constant { companion object { // 接口根地址 const val BASE_URL = "http://xxxx.xxx.xxx/" // 友盟 const val UMENG_APP_KEY = "x

  • Kotlin静态方法的使用浅析

    在Java中定义一个静态方法非常之简单,只需要在方法上声明一个static关键字就可以了: public class Util { public static void doAction(){ System.out.println("do action"); } } 上述代码中doAction()方法是一个静态方法,调用静态的方法并不需要创建实例,因而静态方法非常适合用于编写一些工具类,因为工具类并没有创建实例的必要,基本都是全局通用 和绝大部分不同的是,Kotlin极度弱化了静态方法

  • Kotlin中标准函数run、with、let、also与apply的使用和区别详解

    前言 和Java相比,在Kotlin中提供了不少新的特性.这次我们就来聊一聊Kotlin的一些通用的扩展标准函数run,with,let,also和apply.对于这五个标准函数它们都存在于Kotlin的源码标准库当中,也就是在Standard.kt文件当中.它们都是适用于任何对象的通用扩展函数.但是对于run,with,let,also和apply这五个函数他们的用法及其相似,以至于我们无法确定去选择使用哪一个.那么现在我们就来聊一下这五个函数它们的使用方法,它们的不同之处以及在什么场景下去使

  • 详解Kotlin中如何实现类似Java或C#中的静态方法

    大家可以在网络上搜到不少这样的文章,官方推荐是包级函数,也有人说用伴生对象(companion class).这些都是不错的选择,但并不完善,我们在不同的情况下有更好的选择.我总结了几种方法,分别是:包级函数.伴生对象.扩展函数和对象声明.这需要大家根据不同的情况进行选择. 一.包级函数 Kotlin和Java及C#不同的是,可以在包里面直接声明函数.做法和类中是一样的,这里就不多说了,的确是一个非常好的选择.适用于函数不需要不包内部的类进行数据共享的方法. 二.伴生对象 从语义上来讲,伴生函数

  • Kotlin 标准函数和静态方法示例详解

    目录 标准函数 with run Apply 定义静态方法 注解 顶层方法 标准函数 with with 的作用是可以在连续调用同一对象的多个方法时让代码变得更加精简 val result = with(obj){ //这里是obj的上下文 "value" //with 函数的返回值 } 看个例子,例如有一个水果列表,现在我们想吃完所有水果,并将结果打印出来 val list = listOf("Apple","Banana","Ora

  • Kotlin标准函数与静态方法应用详解

    目录 标准函数 with函数 run函数 apply函数 静态方法 单例类 companion object 注解 顶层方法 标准函数 标准函数就是在Standard.kt文件中定义的函数,任何Kotlin代码都可以自由地调用所有的标准函数 let函数就属于是一个标准函数,经常配合?.操作符来进行判空处理 with函数 with函数接收两个参数,第一参数可以是任何类型的对象,第二个参数是一个Lambda表达式 with函数会在Lambda表达式中提供第一个参数的上下文,并使用Lambda表达式的

  • python编程普通及类和静态方法示例详解

    目录 前言 运行环境 普通方法 类方法 静态方法 前言 本文主要讲述了python类中的三类常用方法,普通方法.类方法和静态方法.  本文主要参考了https://youtu.be/rq8cL2XMM5M,强烈推荐一看这个系列的所有视频. 运行环境 import sys sys.version 结果为 '3.6.1 |Anaconda 4.4.0 (64-bit)| (default, May 11 2017, 13:25:24) [MSC v.1900 64 bit (AMD64)]' 普通方

  • Android开发Kotlin实现圆弧计步器示例详解

    目录 效果图 定义控件的样式 自定义StepView 绘制文本坐标 Android获取中线到基线距离 效果图 定义控件的样式 看完效果后,我们先定义控件的样式 <!-- 自定义View的名字 StepView --> <!-- name 属性名称 format 格式 string 文字 color 颜色 dimension 字体大小 integer 数字 reference 资源或者颜色 --> <declare-styleable name="StepView&q

  • Kotlin编程条件控制示例详解

    目录 本文总览 1. When 表达式 2. If 表达式 总结 本文总览 本篇来看看 Kotlin的条件控制,这一节知识点 建议与Java中的条件结构类比,会很好理解并记住. 1. When 表达式 在 Kotlin 用 when 来定义多个分支的条件表达式.Kotlin中这个语法与 java 中的 switch 语句非常类似.代码块的执行就是将参数与所有的分⽀条件顺序⽐较,直到满⾜某个分⽀条件:(示例 ) when (x) { 1 -> print("x == 1") 2 -

  • Kotlin编程基础数据类型示例详解

    目录 本文总览 1.数值类型 2.布尔型 3.字符串 3.1 字符串字面值 3.2 字符串模板 4.数组 4.1 普通数组 4.2 原⽣类型数组 5.类型检测和类型转换 5.1 智能转换 5.2 is 与 !is 操作符 5.3 转换操作符: as 与 as? 总结 本文总览 上一篇学习了Kotlin基础语法知识,本篇开始会深入探讨一下Kotlin各个基础语法点.首先来熟悉Kotlin的数据类型和类型转换版块. 1.数值类型 在Kotlin中提供了数值类型: 整数类型:Byte,Short,In

  • Kotlin标准函数与静态方法基础知识详解

    目录 标准函数with与run和apply with函数 with函数 run函数 apply函数 定义静态方法 标准函数with与run和apply with函数 with函数 接收两个参数:第一个参数可以是任意类型的对象,第二个参数是一个Lambda表达式.with函数会在Lambda表达式中提供第一个参数对象的上下文,并使用Lambda表达式中的最后一行代码作为返回值返回. 示例代码如下: val result=with(obj){ //这里是obj的上下文 "value"//w

  • Kotlin协程Dispatchers原理示例详解

    目录 前置知识 demo startCoroutineCancellable intercepted()函数 DefaultScheduler中找dispatch函数 Runnable传入 Worker线程执行逻辑 小结 前置知识 Kotlin协程不是什么空中阁楼,Kotlin源代码会被编译成class字节码文件,最终会运行到虚拟机中.所以从本质上讲,Kotlin和Java是类似的,都是可以编译产生class的语言,但最终还是会受到虚拟机的限制,它们的代码最终会在虚拟机上的某个线程上被执行. 之

  • Kotlin编程循环控制示例详解

    目录 本文总览 1. While循环 2. For循环 3. break和continue 3.1 break语句 3.2 continue语句 总结 本文总览 本篇来学习Kotlin循环结构的知识 1. While循环 while循环用于重复迭代代码块,只要给定条件为 true就会执行一次循环代码块.若条件为 false,则直接跳过循环代码块执行后面代码. while (x > 0) { x-- } // 当条件 x>0 成立,x 就会减一 do-while循环 与 while循环相类似,也

  • 图解 Kotlin SharedFlow 缓存系统及示例详解

    目录 前言 replay extraBufferCapacity onBufferOverflow SharedFlow Buffer 前言 Kotlin 为我们提供了两种创建“热流”的工具:StateFlow 和 SharedFlow.StateFlow 经常被用来替代 LiveData 充当架构组件使用,所以大家相对熟悉.其实 StateFlow 只是 SharedFlow 的一种特化形式,SharedFlow 的功能更强大.使用场景更多,这得益于其自带的缓存系统,本文用图解的方式,带大家更

随机推荐