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 b

fun factorial(n:Int):Int {
    if (n <= 1) return n
    else return n*factorial(n-1)
}

fun factorial1(n:Int) = if (n <= 1) n else n*factorial(n-1)
    println(compare1(1,3))//3
    println(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)//5
    var 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))//8
    functionA = 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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/957627.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

持续升级《在线写python》小程序的功能,文章页增加一键复制功能,并自动去掉html标签

增加复制按钮后的界面是这样的 代码如下&#xff1a; <template><view><x-header></x-header><view class"" v-if"article_info"><view class"kuai bgf"><view class"ac fs26"><img sr…

今天也是记录小程序进展的一天(破晓时8)

嗨嗨嗨朋友们&#xff0c;今天又来记录一下小程序的进展啦&#xff01;真是太激动了&#xff0c;项目又迈出了重要的一步&#xff0c;231啦&#xff01;感觉每一步的努力都在积累&#xff0c;功能逐渐完善&#xff0c;离最终上线的目标越来越近了。大家一直支持着这个项目&…

启动虚拟机中客户机后导致电脑蓝屏的解决办法

不考虑重新安装虚拟机的解决办法有两种&#xff1a; vmx文件破损时使用 1&#xff09;删除CentOS 64-bit.vmx文件 2&#xff09;打开vmware-0.log文件&#xff0c;找到CONFIGURATION 和 USER DEFAULTS 并把这两个之间的内容拷贝出来 删除框出来的部分&#xff0c;复制框出来的…

Word2Vec中的CBOW模型训练原理详细解析

Word2Vec中的CBOW模型训练原理详细解析 1. CBOW模型概述 CBOW模型的训练目标是利用一个单词周围的上下文单词来预测该单词本身。具体来说&#xff0c;给定当前单词的上下文单词&#xff0c;通过训练神经网络来最大化当前单词出现在这些上下文单词中的概率。 2. 模型结构 CB…

Android Studio打包APK

1.导出APK安装包 如果是首次打包&#xff0c;Create new 单击蓝色对话框右边文件夹&#x1f4c2;图标 &#xff0c;选择密钥保存路径&#xff0c;然后在下方File name对话框中填写您想要名称&#xff0c;再点击OK回到密钥创建对话框。 在此对话框中填写密码&#xff08;Passwo…

MySql字段的值是以逗号隔开的另一个表的主键关联查询

查询sql SELECT s.student_id, s.name, c.name as course_name FROM student s INNER JOIN course c ON FIND_IN_SET(c.course_id, s.course_id) > 0 WHERE 1 1;相似sql -- 翻译&#xff08;需要带条件&#xff0c;可用于字典翻译&#xff0c;但条件需要注意唯一性&#…

windows git bash 使用zsh 并集成 oh my zsh

参考了 这篇文章 进行配置&#xff0c;记录了自己的踩坑过程&#xff0c;并增加了 zsh-autosuggestions 插件的集成。 主要步骤&#xff1a; 1. git bash 这个就不说了&#xff0c;自己去网上下&#xff0c;windows 使用git时候 命令行基本都有它。 主要也是用它不方便&…

QD Laser携“Lantana”激光器参展SPIE光子学西部展2025,聚焦紧凑型设计

据悉&#xff0c;QD Laser公司将在2025年SPIE光子学西部展览会上展出其最新产品——世界最小一体化紧凑型可见光激光器“Lantana”。该展会将于1月28日至30日在旧金山的Moscone中心举行。 在展会期间&#xff0c;QD Laser公司将现场展示这款超小型、轻便设备—— “Lantana”。…

Ubuntu 22.04 TLS 忘记root密码,重启修改的解决办法

1.想办法进入这个界面&#xff0c;我这里是BIOS引导的是按Esc按一下就行&#xff0c;UEFI的貌似是按Shift不得而知&#xff0c;没操作过。下移到Advanced options for Ubuntu&#xff0c;按enter 2.根据使用的内核版本&#xff0c;选择带「recovery mode」字样的内核版本&#…

Proteus-8086调试汇编格式的一点心得

这阵子开始做汇编的微机实验&#xff08;微机原理与接口技术题解及实验指导&#xff0c;吴宁版本13章&#xff09;&#xff0c;中间出了挺多问题&#xff0c;解决后记录下。 先上电路图 用子电路来仿真发现仿真的时候子电路这块根本没有高低电平输出&#xff0c;只好把子电路拿…

外部flash烧写算法学习笔记(一)

一&#xff0c;STM32CubeProgrammer STM32下载编程工具 | STM32CubeProg介绍、下载、安装和使用教程 - 知乎 1.使用速览 2.外部烧写 二&#xff0c;QSPI外部烧写算法制作 STM32H7的花式玩转SPI Flash章节也更新了&#xff0c;含MDK下载算法制作和STM32CubeProg下载算法制作 …

在centos上编译安装opensips【初级-默认安装】

环境&#xff1a;centos9 last opensips3.2 dnf update -y dnf install -y gcc make git automake libtool pcre-devel libxml2-devel \libcurl-devel postgresql-devel \bzip2-devel zlib-devel ncurses-devel libuuid-devel \libpcap-devel # 有报错的直接删除cd /usr/lo…

【Prometheus】PromQL进阶用法

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Fabric区块链网络搭建:保姆级图文详解

目录 前言1、项目环境部署1.1 基础开发环境1.2 网络部署 2、后台环境2.1、环境配置2.2、运行springboot项目 3、PC端3.1、安装依赖3.2、修改区块链网络连接地址3.3、启动项目 前言 亲爱的家人们&#xff0c;创作很不容易&#xff0c;若对您有帮助的话&#xff0c;请点赞收藏加…

【SpringCloud】黑马微服务学习笔记

目录 1. 关于微服务 ?1.1 微服务与单体架构的区别 ?1.2 SpringCloud 技术 2. 学习前准备 ?2.1 环境搭建 ?2.2 熟悉项目 3. 正式拆分 ?3.1 拆分商品功能模块 ?3.2 拆分购物车功能模块 4. 服务调用 ?4.1 介绍 ?4.2 RustTemplate?的使用 4.3 服务治理-注册中…

RabbitMQ1-消息队列

目录 MQ的相关概念 什么是MQ 为什么要用MQ MQ的分类 MQ的选择 RabbitMQ RabbitMQ的概念 四大核心概念 RabbitMQ的核心部分 各个名词介绍 MQ的相关概念 什么是MQ MQ(message queue)&#xff0c;从字面意思上看&#xff0c;本质是个队列&#xff0c;FIFO 先入先出&am…

鸿蒙参考文档和问题记录

本文用于记录鸿蒙使用过程中的问题和相关参考文档 问题记录 1. 兼容性测试套件问题 ActsStartAbilityForResultNoTargetBundleListStageTest套件测试失败&#xff1a;模块FreeInstall 技术资料 1. HarmonyOS应用如何打包HAP并安装到真机 HarmonyOS应用如何打包HAP并安装到真…

虚幻基础-1:cpu挑选(14600kf)

能帮到你的话&#xff0c;就给个赞吧 &#x1f618; 文章目录 ue非常吃cpu拉满主频打开项目编写蓝图运行原因 时间长 关于压力测试 本文以14600kf为例&#xff0c;双12购入&#xff0c;7月份产。 ue非常吃cpu 经本人测试&#xff0c;ue是非常吃cpu的。 拉满主频 无论任何时间…

css动画水球图

由于echarts水球图动画会导致ios卡顿&#xff0c;所以纯css模拟 展示效果 组件 <template><div class"water-box"><div class"water"><div class"progress" :style"{ --newProgress: newProgress % }"><…

基于 Spring Boot 和 Vue.js 的全栈购物平台开发实践

在现代 Web 开发中&#xff0c;前后端分离的架构已经成为主流。本文将分享如何使用 Spring Boot 和 Vue.js构建一个全栈购物平台&#xff0c;涵盖从后端 API 开发到前端页面实现的完整流程。 1. 技术栈介绍 后端技术栈 JDK 1.8&#xff1a;稳定且广泛使用的 Java 版本。 Spring…