当前位置: 首页 > news >正文

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基础知识学习(三)

函数使用 基本用法 函数声明变化 如果函数是公开的&#xff0c;则public关键字可以省略。用fun关键字表示函数的定义。如果函数没有返回值可以不用声明。如果函数表示重载&#xff0c;直接在fun同一行用override修饰。函数参数格式是变量名&#xff1a;变量类型。函数参数允…...

渗透测试之XEE[外部实体注入]漏洞 原理 攻击手法 xml语言结构 防御手法

目录 原理 XML语言解释 什么是xml语言&#xff1a; 以PHP举例xml外部实体注入 XML语言结构 面试题目 如何寻找xxe漏洞 XEE漏洞修复域防御 提高版本 代码修复 php java python 手动黑名单过滤(不推荐) 一篇文章带你深入理解漏洞之 XXE 漏洞 - 先知社区 原理 XXE&…...

店铺营业状态设置(day05)

Redis入门 Redis简介 Redis 是一个基于内存的 key-value 结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件。 Redis是一个基于内存的 key-value 结构数据库。 主要特点&#xff1a; 1、基于内存存储&#xff0c;读写性能高 2、适合存储热点数据&#xff08;热点…...

游戏引擎学习第84天

仓库:https://gitee.com/mrxiao_com/2d_game_2 我们正在试图弄清楚如何完成我们的世界构建 上周做了一些偏离计划的工作&#xff0c;开发了一个小型的背景位图合成工具&#xff0c;这个工具做得还不错&#xff0c;虽然是临时拼凑的&#xff0c;但验证了背景构建的思路。这个过…...

快手SDK接入错误处理经验总结(WebGL方案)

1、打包时提示Assets\WebGLTemplates\ks路径下未找到Index.html文件错误 处理方法&#xff1a;直接使用Unity默认模板下的Index.html文件即可 文件所在路径&#xff1a;Unity安装路径\Editor\Data\PlaybackEngines\WebGLSupport\BuildTools\WebGLTemplates\Default 参考图&a…...

C语言 for 循环:解谜数学,玩转生活!

放在最前面的 &#x1f388; &#x1f388; 我的CSDN主页:OTWOL的主页&#xff0c;欢迎&#xff01;&#xff01;&#xff01;&#x1f44b;&#x1f3fc;&#x1f44b;&#x1f3fc; &#x1f389;&#x1f389;我的C语言初阶合集&#xff1a;C语言初阶合集&#xff0c;希望能…...

Node.js 与 JavaScript 是什么关系

JavaScript 是一种编程语言&#xff0c;而 Node.js 是 JavaScript 的一个运行环境&#xff0c;它们在不同的环境中使用&#xff0c;具有一些共同的语言基础&#xff0c;但也有各自独特的 API 和模块&#xff0c;共同推动着 JavaScript 在前后端开发中的广泛应用。 一、基础语言…...

Java 大视界 -- Java 大数据性能监控与调优:全链路性能分析与优化(十五)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

深入Spring Boot:自定义Starter开发与实践

引言 Spring Boot通过其强大的自动配置机制和丰富的Starter模块&#xff0c;极大地简化了Spring应用的开发过程。Starter模块封装了一组相关的依赖和配置&#xff0c;使得开发者可以通过简单的依赖引入&#xff0c;快速启用特定的功能。然而&#xff0c;除了使用Spring Boot提…...

React 中hooks之useTransition使用总结

目录 概述基本用法使用场景最佳实践注意事项 概述 什么是 useTransition? useTransition 是 React 18 引入的新 Hook&#xff0c;用于标记非紧急的状态更新。它允许组件在状态转换期间保持响应&#xff0c;通过将某些更新标记为"过渡"来推迟它们的渲染。 主要特…...

怎样使用树莓派自己搭建一套ADS-B信号接收系统

0 我们知道&#xff0c;ADS-B全称广播式自动相关监视系统&#xff0c;其实就是飞机发出的广播信号&#xff0c;用明码来对外发送自己的位置、高度、速度、航向等信息&#xff0c;是公开信息。连续接收到一架飞机发出的ADS-B信息后&#xff0c;可以通过其坐标点来描绘出飞机的航…...

Chrome谷歌浏览器如何能恢复到之前的旧版本

升级了谷歌最新版不习惯&#xff0c;如何降级版本 未完待续。。 电脑中的Chrome谷歌浏览器升级到了最新版本&#xff0c;但是有种种的不适应&#xff0c;如何能恢复到之前的旧版本呢&#xff1f;我们来看看操作步骤&#xff0c;而且无需卸载重装。 怎么恢复Chrome 之前版本&a…...

路由器旁挂三层网络实现SDWAN互联(爱快SD-WAN)

近期因公司新办公区建设&#xff0c;原有的爱快路由器的SDWAN功能实现分支之间互联的服务还需要继续使用。在原有的小型网络中&#xff0c;使用的爱快路由器当作网关设备&#xff0c;所以使用较为简单,如下图所示。 现变更网络拓扑为三层网络架构&#xff0c;但原有的SDWAN分支…...

代码随想录算法训练营第五十五天 |108.冗余连接 109.冗余连接Ⅱ

108.冗余连接&#xff1a; 文章链接 题目链接&#xff1a;108.冗余连接 思路 首先分析题目&#xff0c;给定拥有n个节点和n条边的图&#xff0c;其中图是在原n个节点和n - 1条无环无向图中添加一条边得到的。要求是输出多出的边。&#xff08;PS&#xff1a;可能会有多个答案…...

Unity补充 -- 协程相关

1.协程。 协程并不是线程。线程是主线程之外的另一条 代码按照逻辑执行通道。协程则是在代码在按照逻辑执行的同时&#xff0c;是否需要执行额外的语句块。 2.协程的作用。 在update执行的时候&#xff0c;是按照帧来进行刷新的&#xff0c;也是按照帧执行代码的。但是又不想…...

【第二十周】U-Net:用于生物图像分割的卷积神经网络

文章目录 摘要Abstract文章信息研究动机U-Net网络结构U-Net网络搭建数据增强损失函数转置卷积创新性与不足创新性&#xff1a;不足&#xff1a; 总结 摘要 U-Net&#xff08;Convolutional Networks for Biomedical Image Segmentation&#xff09;是一种用于图像分割的深度学…...

部署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

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、 前期准备 1. 设置GPU 如果设备上支持GPU就使用GPU,否则使用CPU import torch import torch.nn as nn import torchvision.transforms as transforms im…...

云计算与物联网技术的融合应用(在工业、农业、家居、医疗、环境、城市等整理较全)

摘要 为生产领域带来更加全面和深入的变革。通过云计算平台对物联网数据进行处理和分析&#xff0c;企业可以实现对生产过程的更加精细化的管理和控制。 1. 智能生产调度 通过云计算和物联网技术的融合应用&#xff0c;企业可以实现对生产线上各个环节的实时监控和数据分析。…...

基于python+Django+mysql鲜花水果销售商城网站系统设计与实现

博主介绍&#xff1a;黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者&#xff0c;CSDN博客专家&#xff0c;在线教育专家&#xff0c;CSDN钻石讲师&#xff1b;专注大学生毕业设计教育、辅导。 所有项目都配有从入门到精通的基础知识视频课程&#xff…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...