Kotlin标准函数与静态方法应用详解
作者:z啵唧啵唧 发布时间:2022-01-21 10:45:33
标准函数
标准函数就是在Standard.kt文件中定义的函数,任何Kotlin代码都可以自由地调用所有的标准函数
let函数就属于是一个标准函数,经常配合?.操作符来进行判空处理
with函数
with函数接收两个参数,第一参数可以是任何类型的对象,第二个参数是一个Lambda表达式
with函数会在Lambda表达式中提供第一个参数的上下文,并使用Lambda表达式的最后一行代码作为函数的返回值
示例代码
val res = with(obj) {
//这里是obj对象的上下文
"value"//这里是with函数的返回值
}
with函数的作用.假如现在有个需求让吃完所有的水果并且将结果打印出来,代码可以这样写
fun main() {
doSomething()
}
fun doSomething() {
val list = listOf<String>("Apple", "Banana", "Pear")
val sb = StringBuilder()
sb.append("Start eating fruits.\n")
for (fruits in list) {
sb.append(fruits).append("\n")
}
sb.append("Ate all fruits.")
val res = sb.toString()
println(res)
}
利用with函数可以这样写,可以看到在Lambda表达式中,都是StringBuilder的上下文,那么就不需要我们通过StringBuilder的实例调用append()方法了,而是直接使用append()方法即可.
fun withTest() {
val list = listOf<String>("Apple", "Banana", "Pear")
val res = with(StringBuilder()) {
append("Start eating fruits.\n")
for (fruits in list) {
append(fruits)
append("\n")
}
append("Ate all fruits.")
toString()//最后一行就是函数的返回值
}
println(res)
}
run函数
run函数和with函数基本类似,区别就是,run函数不能直接调用,需要在某个对象的基础上进行调用
其次run函数只接受一个Lambda参数,并且在Lambda表达式中提供调用对象的上下文.
其他和with函数都是一样的
使用run函数完成上述需求的实例
fun runTest() {
val list = listOf<String>("Apple", "Banana", "Pear")
//将StringBuilder调出来,用来调用run函数
val res = StringBuilder().run {
append("Start eating fruits.\n")
for (fruits in list) {
append(fruits)
append("\n")
}
append("Ate all fruits.")
toString()
}
println(res)
}
apply函数
apply函数和run函数基本一样,就是apply函数不能指定返回值,只能返回调用调用者的本身
apply函数实例
fun applyTest() {
val list = listOf<String>("Apple", "Banana", "Pear")
val res = StringBuilder().apply {
append("Start eating fruits.\n")
for (fruits in list) {
append(fruits)
append("\n")
}
append("Ate all fruits.")
}
println(res.toString())
}
静态方法
静态方法又叫做类方法,就是说不需要实例,直接用类就可以进行调用,一般会将工具类中的方法设置为静态方法,方便调用
在java当中的静态方法就是使用static关键字修饰的方法
但是在kotlin当中没有直接的静态方法
单例类
在kotlin当中要是想要定义一个工具类,会比较推荐单例类进行实现
object Util {
fun doAction() {
println("do something")
}
}
虽然单例类中的doAction()方法并不是静态放啊,但是我们还是可以直接使用Util.doAction()来进行调用
但是单例类的缺点是单例类中的方法都是类似静态方法这种调用方式,但是我们只需要让类中的一个方法变成静态的怎么办?
companion object
在companion object中定义的方法就可以类似于静态方法那样进行调用了
class Util {
//非静态方法属性
fun doAction1() {
}
//拥有静态方法的属性
companion object {
fun doAction2() {
}
}
}
注解
单例类和companion object都是在语法形式上模仿了静态方法,实际上不属于真正的静态方法
如果我们给单例类或者companion object中的方法加上@JvmStatic注解,那么kotlin编译器就会将这些方法编译成为真正的静态方法
如下
class Util {
//非静态方法属性
fun doAction1() {
}
//拥有静态方法的属性
companion object {
@JvmStatic
fun doAction2() {
}
}
}
@JvmStatic只能加在单例类或者companion object中的方法
顶层方法
顶层方法指的就是没有定义在任何类中的方法,kotlin编译器会将所有的顶层方法编译成为静态方法
因此只要定义了一个顶层方法,那么他肯定是一个静态方法
来源:https://blog.csdn.net/weixin_45809829/article/details/128019441


猜你喜欢
- 这里我们给定一个集合strings一、写法1–循环for (int i = 0, len = strings.size(); i <
- 一.前言RabbitMQ 是一种快速、灵活、可靠的消息传递方式,可用于构建分布式应用程序、异步处理任务、实现消息队列等。下面是 Java 原
- PagerBottomTabStrip 是一个基本按谷歌Material Design规范完成的安卓底部导航栏控件官方设计规范:https:
- * 与过滤器在讲Spring boot之前,我们先了解一下过滤器和 * 。这两者在功能方面很类似,但是在具体技术实现方面,差距还是比较大的
- 本文实例讲述了Android开发之全屏与非全屏的切换设置方法。分享给大家供大家参考,具体如下:静态方法1. 代码方式在Activity类On
- File存储(内部存储)一旦程序在设备安装后,data/data/包名/ 即为内部存储空间,对外保密。Context提供了2个方法来打开输入
- Tomcat 如何实现WebSocketWebSocket协议属于HTML5标准,越来越多浏览器已经原生支持WebSocket,它能让客户端
- jdk1.8中的for循环jdk1.8 从语法角度,感觉发生的变化还是蛮大的。在此记录一下。for 循环 public stati
- 目录一、首先自定义筛选框的按钮视图,布局很简单,一个listView就可以搞定。二、定义筛选数据展示列表视图。一、首先自定义筛选框的按钮视图
- C#中的null与SQL中的NULL是不一样的,SQL中的NULL用C#表示出来就是DBNull.Value。注意:SQL参数是不能接受C#
- 1、认识 Spring CacheSpring Cache是Spring提供的一整套缓存解决方案。它本身并不提供缓存实现,而是提供统一的接口
- 报错翻译: compileSdkVersion android-24”需要JDK 1.8或更高版本编译。报错现象如下图:原因:st
- 一、将已经编译后的java中Class文件进行打包;打包命令JAR 如:将某目录下的所有class文件夹全部进行打包处理;使用的命令:jar
- 本文实例讲述了C#实现动态加载dll的方法。分享给大家供大家参考。具体实现方法如下:using System;using System.Co
- 前言相信大家都用过Spring Security和Shiro的框架,Spring Security必须配合Spring 全家桶使用和繁琐的配
- 我们知道Android手机操作系统采用的是Linux内核,Linux中最高的系统权限就是Root,这就类似与Windows中的Adminis
- 本文实例总结了C#生成随机数的方法。分享给大家供大家参考。具体分析如下:开始,很简单地使用System.Random类来生成随机数。很快,问
- 存储访问框架,简称:SAF, 就是系统文件选择器+文件操作API。先选择文件,在用文件操作API处理文件。系统文件选择器,就和Windows
- MVC中,一般的情况下,使用IDE工具帮我们生成的代码,在路由注册的时候:public static void RegisterRoutes
- android客户端生成本地验证码主要用来限制用户随意按请求按钮,其实该示例也是来对自定义view的练练手而已,先给出效果图吧其中可定制:*