Kotlin基础知识学习(三)
函数使用
基本用法
函数声明变化
- 如果函数是公开的,则public关键字可以省略。
- 用fun关键字表示函数的定义。
- 如果函数没有返回值可以不用声明。
- 如果函数表示重载,直接在fun同一行用override修饰。
- 函数参数格式是变量名:变量类型。
- 函数参数允许空值则在后面加上?。
/*** 1、公共方法 public可以省略* 2、fun关键字表示函数定义* 3、test 方法名* 4、返回值在()后面,:Unit没有返回值,可以省略不写*/
fun test(){println("没有入参,没有返回值的函数")
}
fun test():Unit{println("没有入参,没有返回值的函数")
}
//无参函数调用test()//没有入参,没有返回值的函数
入参格式
- 参数格式(变量名:变量类型)
- 允许变量为空格式(变量名:变量类型?)
/*** 1、参数声明格式:变量:变量类型* @param name 名字* @param price 价格*/
fun test1(name:String,price:Int){println("${name}买了一个${price}元的鸡蛋")
}
//有参函数调用test1("张三",10)//张三买了一个10元的鸡蛋
/*** 1、如果参数运行为空在变量类型后面加上?* @param name 名字* @param price 价格*/
fun test1(name:String?,price:Int){if(name != null){println("${name}买了一个${price}元的鸡蛋")}
}
返回格式
- 如果有返回值需要在()后面加上返回值类型,格式(:返回值类型),可以理解成跟变量定义一样。
- 如果没有返回值可以不用写,默认也会返回一个Unit类型对象。
- 返回值也是在方法体里用return返回。
/*** 1、有返回值需要在()后面加上【:返回值类型】* 2、方法体需要通过return 返回对应类型的数据* @param name 名字* @param price 价格*/
fun test2(name:String,price:Int):String{println("${name}买了一个${price}元的鸡蛋")return "${name}买到鸡蛋了"
}
//有返回值的函数调用var str = test2("李四",1)//李四买了一个1元的鸡蛋println(str)//李四买到鸡蛋了
入参参数的变化
参数默认值
- 函数入参参数可以指定默认值
- 格式(变量名:变量类型 = 默认值)
/*** 1、参数可以指定默认值* 2、格式:变量类型=默认值* @param mountain*/
fun test(mountain:String,first:String="东岳泰山", second:String="西岳华山", third:String="南岳衡山", fourth:String="北岳恒山",five:String="中岳嵩山"){println("${mountain}是$first,$second,$third,$fourth,$five")
}
//参数指定默认值,调用的时候可以不用再写test("中国五岳")//中国五岳是东岳泰山,西岳华山,南岳衡山,北岳恒山,中岳嵩山//调用的时候修改默认值,第一个默认参数可以直接修改test("中国五岳","泰山")//中国五岳是泰山,西岳华山,南岳衡山,北岳恒山,中岳嵩山
指定参数的默认值
- 如果在函数调用的时候,只想改某个参数的默认值,可以通过变量名进行指定。
//如果修改的不是第一个有默认值的参数,需要通过变量名指定test("中国五岳", second = "华山")//中国五岳是东岳泰山,华山,南岳衡山,北岳恒山,中岳嵩山
可变参数
- kotlin中可变参数是用关键字vararg进行修饰。
- 格式(vararg 变量名:变量类型)。
- 函数在解析的时候会将可变参数转化成数组,可通过数组形式进行访问。
/*** 1、参数可用可变参数,用关键字vararg说明* 2、格式:vararg 参数变量名:类型* 3、kotlin在解析的时候会把可变参数解析成数组* @param mountain*/
fun test1(mountain:String,vararg strArray:String){var str = ""for (item in strArray){str += "$item "}println("${mountain}是$str")
}
test1("中国五岳", "东岳泰山","西岳华山","南岳衡山","北岳恒山","中岳嵩山")//中国五岳是东岳泰山 西岳华山 南岳衡山 北岳恒山 中岳嵩山
特殊函数
泛型函数
- 定义泛型函数时,得在函数名称前面添加“”,表示以T声明的参数(包括输入参数和输出参数),其参数类型必须在函数调用时指定。
- 调用格式(函数名称<具体类型>)。
/*** 泛型函数:<T> T表示泛型*/
fun <T> test(tag:String,vararg array:T){var str:String = "$tag:"for (item in array){str = "$str${item.toString()} "}println(str)//中国五岳:东岳泰山 西岳华山 南岳衡山 北岳恒山 中岳嵩山
}
test<String>("中国五岳","东岳泰山","西岳华山","南岳衡山","北岳恒山","中岳嵩山")test<Int>("10以内的偶数",2,4,6,8,10)//10以内的偶数:2 4 6 8 10
内联函数
- 内联函数在编译的时候被内联展开,即将函数体直接插入到调用该函数的地方。
- 内联函数主要用于消除函数调用的开销,特别是对于那些小而频繁调用的函数非常有用。
- 内联函数还可以用于实现一些高级特性,如非局部返回和重尾递归优化。
- 用关键字inline表示内联函数。
/*** 内联函数 用关键字inline* 在调用处将函数体直接插入*/
inline fun <T> setNumber(number: T){println(number)
}
setNumber(1)setNumber("张三")
函数简化
- 函数有返回值定义可以当初特殊的变量,变量可以通过=进行赋值,所以对于函数体是比较简单的可以通过=直接赋值给函数。
fun compare(a:Int,b:Int):Int{if(a > b){return a} else {return b}
}/*** 函数有返回值定义可以当初特殊的变量,变量可以通过=进行赋值* 所以对于函数体是比较简单的可以通过=直接赋值给函数*/
fun compare1(a:Int,b:Int) = if(a > b) a else bfun factorial(n:Int):Int {if (n <= 1) return nelse return n*factorial(n-1)
}fun factorial1(n:Int) = if (n <= 1) n else n*factorial(n-1)
println(compare1(1,3))//3println(factorial1(3))//6
尾递归函数
- 尾递归(Tail Recursion)是一种递归形式,其中递归调用是函数执行的最后一步。
- 通过关键字tailrec修饰。
- 尾递归优化是一种编译器优化技术,可以将尾递归调用转换为循环,从而避免栈溢出并提高性能。
/*** 尾递归函数,用tailrec进行修饰*/
tailrec fun tailRecursiveFactorial(n: Int, accumulator: Int = 1):Int{if(n <= 1){return accumulator} else {return tailRecursiveFactorial(n-1,n*accumulator)}
}
println(tailRecursiveFactorial(3))//6
高阶函数
- 高阶函数(Higher-Order Function)是指一个函数,它可以接收另一个函数作为参数,或者返回一个函数作为结果。
- 高阶函数提供了一种非常灵活和强大的方式来处理函数逻辑,使得代码更加模块化和可重用。
接收函数作为参数
高阶函数可以接收一个或多个函数类型的参数。
格式:函数名称:(参数)->函数返回值
/*** 函数A作为函数B的参数* operation:(Int,Int) -> Int* operation是函数A的名称* (Int,Int)是函数A的参数* -> Int是函数A的返回值类型*/
fun applyOperation(x:Int,y:Int,operation:(Int,Int) -> Int):Int{return operation(x,y)
}
//{ a, b -> a + b } 表示参数函数A的参数和函数体,用->隔开var result = applyOperation(2,3) { a, b -> a + b }println(result)//5var result1 = applyOperation(2,3) { a, b -> a * b }println(result1)//6
返回函数作为结果
高阶函数可以返回一个函数类型的结果。
格式:在高阶函数后面:(参数)->返回值类型
/*** 函数A作为函数B的返回值* :(Int,Int)->Int* (Int,Int)是函数A的参数* ->Int 函数A的返回值*/
fun functionB(a:Int):(Int,Int)->Int{return when(a){1 -> {b,c -> b+c}2 -> {b,c -> b-c}3 -> {b,c -> b*c}else -> {b,c -> b/c}}
}
//返回函数var functionA = functionB(1)println(functionA(3,5))//8functionA = functionB(2)println(functionA(3,5))//-2
标准库中的高阶函数
Kotlin 标准库中有许多高阶函数,比如 let、run、apply、also、filter、map 等。这些函数极大地简化了集合操作和其他常见编程任务。
val numbers = listOf(1, 2, 3, 4, 5)
val doubled = numbers.map { it * 2 }
println(doubled) // 输出: [2, 4, 6, 8, 10]
扩展函数
扩展函数(Extension Function)是一种特殊类型的函数,它可以为现有的类添加新的成员函数,而无需使用继承或修改原有类的源代码。这种功能是通过静态成员函数的语法糖来实现的,尽管在底层实现上它们并不是真正的类成员方法。
定义:扩展函数使用receiverType.functionName的语法进行定义,其中receiverType是你要扩展的类名,functionName是你想要添加的函数名。函数体内部可以通过this关键字来引用接收者对象(即receiverType的实例)。
/*** 扩展函数,格式:原有类.扩展函数的名称* 对系统Array类增加交换扩展函数*/
fun <T> Array<T>.swap(pos1:Int,pos2:Int){val temp = this[pos1]this[pos1] = this[pos2]this[pos2] = temp
}
val intArray = arrayOf(1,2,3,4,5)//扩展函数调用跟普通函数一样intArray.swap(1,2)
相关文章:
Kotlin基础知识学习(三)
函数使用 基本用法 函数声明变化 如果函数是公开的,则public关键字可以省略。用fun关键字表示函数的定义。如果函数没有返回值可以不用声明。如果函数表示重载,直接在fun同一行用override修饰。函数参数格式是变量名:变量类型。函数参数允…...
渗透测试之XEE[外部实体注入]漏洞 原理 攻击手法 xml语言结构 防御手法
目录 原理 XML语言解释 什么是xml语言: 以PHP举例xml外部实体注入 XML语言结构 面试题目 如何寻找xxe漏洞 XEE漏洞修复域防御 提高版本 代码修复 php java python 手动黑名单过滤(不推荐) 一篇文章带你深入理解漏洞之 XXE 漏洞 - 先知社区 原理 XXE&…...
店铺营业状态设置(day05)
Redis入门 Redis简介 Redis 是一个基于内存的 key-value 结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件。 Redis是一个基于内存的 key-value 结构数据库。 主要特点: 1、基于内存存储,读写性能高 2、适合存储热点数据(热点…...
游戏引擎学习第84天
仓库:https://gitee.com/mrxiao_com/2d_game_2 我们正在试图弄清楚如何完成我们的世界构建 上周做了一些偏离计划的工作,开发了一个小型的背景位图合成工具,这个工具做得还不错,虽然是临时拼凑的,但验证了背景构建的思路。这个过…...
快手SDK接入错误处理经验总结(WebGL方案)
1、打包时提示Assets\WebGLTemplates\ks路径下未找到Index.html文件错误 处理方法:直接使用Unity默认模板下的Index.html文件即可 文件所在路径:Unity安装路径\Editor\Data\PlaybackEngines\WebGLSupport\BuildTools\WebGLTemplates\Default 参考图&a…...
C语言 for 循环:解谜数学,玩转生活!
放在最前面的 🎈 🎈 我的CSDN主页:OTWOL的主页,欢迎!!!👋🏼👋🏼 🎉🎉我的C语言初阶合集:C语言初阶合集,希望能…...
Node.js 与 JavaScript 是什么关系
JavaScript 是一种编程语言,而 Node.js 是 JavaScript 的一个运行环境,它们在不同的环境中使用,具有一些共同的语言基础,但也有各自独特的 API 和模块,共同推动着 JavaScript 在前后端开发中的广泛应用。 一、基础语言…...
Java 大视界 -- Java 大数据性能监控与调优:全链路性能分析与优化(十五)
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...
深入Spring Boot:自定义Starter开发与实践
引言 Spring Boot通过其强大的自动配置机制和丰富的Starter模块,极大地简化了Spring应用的开发过程。Starter模块封装了一组相关的依赖和配置,使得开发者可以通过简单的依赖引入,快速启用特定的功能。然而,除了使用Spring Boot提…...
React 中hooks之useTransition使用总结
目录 概述基本用法使用场景最佳实践注意事项 概述 什么是 useTransition? useTransition 是 React 18 引入的新 Hook,用于标记非紧急的状态更新。它允许组件在状态转换期间保持响应,通过将某些更新标记为"过渡"来推迟它们的渲染。 主要特…...
怎样使用树莓派自己搭建一套ADS-B信号接收系统
0 我们知道,ADS-B全称广播式自动相关监视系统,其实就是飞机发出的广播信号,用明码来对外发送自己的位置、高度、速度、航向等信息,是公开信息。连续接收到一架飞机发出的ADS-B信息后,可以通过其坐标点来描绘出飞机的航…...
Chrome谷歌浏览器如何能恢复到之前的旧版本
升级了谷歌最新版不习惯,如何降级版本 未完待续。。 电脑中的Chrome谷歌浏览器升级到了最新版本,但是有种种的不适应,如何能恢复到之前的旧版本呢?我们来看看操作步骤,而且无需卸载重装。 怎么恢复Chrome 之前版本&a…...
路由器旁挂三层网络实现SDWAN互联(爱快SD-WAN)
近期因公司新办公区建设,原有的爱快路由器的SDWAN功能实现分支之间互联的服务还需要继续使用。在原有的小型网络中,使用的爱快路由器当作网关设备,所以使用较为简单,如下图所示。 现变更网络拓扑为三层网络架构,但原有的SDWAN分支…...
代码随想录算法训练营第五十五天 |108.冗余连接 109.冗余连接Ⅱ
108.冗余连接: 文章链接 题目链接:108.冗余连接 思路 首先分析题目,给定拥有n个节点和n条边的图,其中图是在原n个节点和n - 1条无环无向图中添加一条边得到的。要求是输出多出的边。(PS:可能会有多个答案…...
Unity补充 -- 协程相关
1.协程。 协程并不是线程。线程是主线程之外的另一条 代码按照逻辑执行通道。协程则是在代码在按照逻辑执行的同时,是否需要执行额外的语句块。 2.协程的作用。 在update执行的时候,是按照帧来进行刷新的,也是按照帧执行代码的。但是又不想…...
【第二十周】U-Net:用于生物图像分割的卷积神经网络
文章目录 摘要Abstract文章信息研究动机U-Net网络结构U-Net网络搭建数据增强损失函数转置卷积创新性与不足创新性:不足: 总结 摘要 U-Net(Convolutional Networks for Biomedical Image Segmentation)是一种用于图像分割的深度学…...
部署Metricbeat监测ES
官方参考文档 安装Metricbeat curl -L -O https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-7.17.27-linux-x86_64.tar.gztar xzvf metricbeat-7.17.27-linux-x86_64.tar.gz设置 Metricbeat连接到 Elasticsearch 进入metricbeat目录配置metricbeat.yml …...
Pytorch|YOLO
🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊 一、 前期准备 1. 设置GPU 如果设备上支持GPU就使用GPU,否则使用CPU import torch import torch.nn as nn import torchvision.transforms as transforms im…...
云计算与物联网技术的融合应用(在工业、农业、家居、医疗、环境、城市等整理较全)
摘要 为生产领域带来更加全面和深入的变革。通过云计算平台对物联网数据进行处理和分析,企业可以实现对生产过程的更加精细化的管理和控制。 1. 智能生产调度 通过云计算和物联网技术的融合应用,企业可以实现对生产线上各个环节的实时监控和数据分析。…...
基于python+Django+mysql鲜花水果销售商城网站系统设计与实现
博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育、辅导。 所有项目都配有从入门到精通的基础知识视频课程ÿ…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
