标准函数

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 标准函数静态方法的资料请关注Devmax其它相关文章!

Kotlin 标准函数和静态方法示例详解的更多相关文章

  1. 在Xcode 4中构建与Objective-c应用程序一起使用的静态C lib

    最好的祝福,吉米解决方法JimmyKoerting在评论中提供了正确的答案:应用程序需要与libstdc.dylib链接以解析标准库符号.感谢JimmyKoerting,但还有一件我想添加的内容是,如果您在iOS6.1中使用xcode最新版本,请添加此libstdc.6.dylib

  2. ios – 如何从故事板中创建的静态UITableView中删除单元格

    解决方法你不能真正处理这个数据源,因为使用静态表,你甚至没有实现数据源方法.高度是走的路.尝试这个:更新看来,在autolayout下,这可能不是最好的解决方案.有一个替代答案here可能有帮助.

  3. ios – 两个类,回调和单元测试

    而且,我不觉得这样的行为会很容易测试?

  4. ios – 在分组的表视图中混合静态和动态部分

    可能需要保持静电细胞的强大性能?在表视图的相同.xib文件中直接设计每个静态单元格,并为它们设置插座是否更好?(虽然这不允许重用我的自定义单元格设计…

  5. ios – OS X:将.dylib转换为.a / .o(动态到静态)?

    假设我已经阅读了thiscaveat,我仍然希望将TBB用作静态链接库.但我真的不想重写TBBmakefile来生成libtbb.a而不是libtbb.dylib.是否有一个简单的命令行方式将libtbb.dylib转换为libtbb.o并使用相同的入口点?

  6. xcode – Swift Constants文件 – 类还是结构?

    我想在我的Swift项目中创建一个Constants文件–填充静态let字符串.我应该创建一个结构还是一个类?

  7. ios – 如何将静态单元格拖入tableView swift?

    我在storyBoard中有一个tableView,我在其中添加了4个静态单元格,我的storyBoard看起来像:我没有这个tableView的任何dataSource,因为我的单元格是静态的.我使用下面的代码拖动一个单元格,它工作正常,直到我滚动一个表格.拖动后滚动它看起来像:正如你所看到的那样,细胞不再出现了.我想拖放静态单元格,我想保存它的位置,所以当我滚动时我不会再重新排列.Sample

  8. ios – 示例代码中AVFoundation.Framework中的静态void指针

    我正在浏览AVFoundation.Framework的示例代码–>AVSimpleEditoriOS&我发现以下一行我无法理解.考虑以下在上面的两行中,我可以看出那些是2个静态的void/generic指针,带有一些奇特的名字.现在回到这两行,我再次粘贴在这里,上面的意思是,2个静态void/generic指针存储它自己的&为什么它需要在什么意义上?我只需要很少的指导来学习这种编码模式.等待知识

  9. ios – Static Cells在Interface Builder中显示为空(运行XCode 7.1)

    解决方法终于找到了一个解决方法,因为这仍然发生在Xcode7.2Beta中:在InterfaceBuilder中,选择ViewController并在属性检查器中将其模拟大小设置为“Freeform”,然后切换到大小检查器并设置适合整个内容的高度.说实话,这比滚动更好.猜猜这将成为我在IB中静态表视图的默认设置.版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  10. swift 2.0 结构体

    //12.结构体--目前没什么特别的应用场景,大多都用类来写的。init{self.age=ageself.gender=gender}funceat{print}//静态方法--里只能使用静态属性staticfuncwalk(){print}}varperson_12=Personprint

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部