1. 普通函数

    // 无返回值fun print(msg: String) {println(msg)}// 正常写法,有返回值fun sum(num1: Int = 0, num2: Int = 0): Int {return num1 + num2}// 当只有一行代码的时候,可以省略函数体部分fun sum(num1: Int = 0, num2: Int = 0): Int = num1 + num2

2. 标准函数

2.1 let 使用

1、let既不是操作符,也不是关键字,它是一个函数,当调用了对象的let函数,然后Lambda表达式中的代码就会立即执行,并且这个对象也会作为参数传递到Lambda表达式中

2、let函数搭配?.来使用时,Lambda表达式中的被传递进来的对象肯定非空

3、let函数可以处理全局变量的判空问题,而if语句无法做到这点

    fun eatA(a: A?) {a?.let { a1 -> a1.eat()}}
2.2 with 使用

1、with函数接收两个参数,第一个参数是一个任一类型的对象第二个参数使Lambda表达式

2、with函数会在Lambda表达式中提供第一个参数对象的上下文,并使用Lambda表达式的最后一行代码作为返回值返回

    fun withDemo() {val list = listOf('a', 'b', 'c', 'd', 'e')val result = with(StringBuilder()) {// 在Lambda中,StringBuilder为上下文for (c in list) {append(c)}toString()}println(result)// 打印结果:abcde}
2.3 run 使用

1、run函数的使用方法跟场景跟with函数十分类似,只是语法上做了稍微的修改,run函数不能直接被调用,必须通过调用对象的run函数才行

    fun runDemo() {val list = listOf('a', 'b', 'c', 'd', 'e')val sb = StringBuilder()val result = sb.run {// 在Lambda中,StringBuilder为上下文for (c in list) {append(c)}toString()}println(result)// 打印结果:abcde}
2.4 apply 使用

1、apply函数和run函数也是极为类型,只是apply函数无法指定返回值,而是会自动返回调用对象本身

    fun applyDemo() {val list = listOf('a', 'b', 'c', 'd', 'e')val sb = StringBuilder()val result = sb.apply {// 在Lambda中,StringBuilder为上下文for (c in list) {append(c)}}println(result.toString())// 打印结果:abcde}
2.5 repeat 使用

1、用于将字符串重复打印n次

    fun repeatDemo() {val str = "abc"println(str.repeat(3))// 打印结果:abcabcabc}

repeat 源码:

    public actual fun CharSequence.repeat(n: Int): String {require(n >= 0) { "Count 'n' must be non-negative, but was $n." }return when (n) {0 -> ""1 -> this.toString()else -> {when (length) {0 -> ""1 -> this[0].let { char -> String(CharArray(n) { char }) }else -> {val sb = StringBuilder(n * length)for (i in 1..n) {sb.append(this)}sb.toString()}}}}
}

3. 静态函数

3.1 companion object

companion object 这个关键字实际上会在类内部创建一个伴生类,定义在伴生类里面的方法为伴生类内部的实例方法,使用的时候可像静态方法那样的方式调用该方法,但其并不是真正的静态方法

    class StaticMethodTest {companion object {fun doAction() {println("do action")}}}class Test {fun main() {StaticMethodTest.doAction()}}
3.2 单例类

与其他主流语言不同的是,kotlin极度弱化了静态方法这个概念,其提供了一种比静态方法更好的语法特性,仅需在类名前将class替换成object关键字,即可将该类变成一个单例类

注意:object 关键字不能与 companion object 同时存在

    // 单例类object StaticMethodTest {fun doAction() {println("do action")}}class Test {fun main() {StaticMethodTest.doAction()}}
3.3 @JvmStatic

若想真正的定义静态方法,Kotlin为我们提供了两种方式:注解和顶层方法

先来讲讲注解,前面的单例类与伴生类调用方法的语法形式上模仿了静态方法的调用方式,但其并不是真正的静态方法,为此我们可以在单例类或者伴生类的方法上加个@JvmStatic注解,那么Kotlin编译器就会将该方法变成真正的静态方法

    // 单例类object ObjectMethodTest {@JvmStaticfun doAction() {println("do action1")}}class CompanionObjectTest {companion object {@JvmStaticfun doAction() {println("do action2")}}}class Test {fun main() {// 调用单例类中的静态方法ObjectMethodTest.doAction()// 调用伴生类中的静态方法CompanionObjectTest.doAction()}}
3.4 顶层方法

顶层方法是指那些没有定义在任何类中的方法,在编写的时候,我们需要创建一个新的Kotlin File/Class文件,但其需要选择File文件

Kotlin编译器会将所有的顶层方法全部编译成静态方法,因此只要定义了顶层方法,那么其就是静态方法

定义了顶层方法后,调用方式就跟调用静态方法一样:

    // 在Kotlin中class Test {fun main() {// 调用顶层方法(TopStaticMethod.kt)doAction()}}// 在JAVA中
public class Main {public static void main(String[] args) {// 调用Kotlin顶层方法// Kotlin文件名叫做TopStaticMethod,Kotlin编译器会自动创建一个叫做TopStaticMethodKt类// 在JAVA中调用Kotlin顶层方法时,就可像调用静态方法的方式调用TopStaticMethodKt.doAction();}
}

4. 扩展函数

什么是扩展函数?扩展函数是即使不修改某个类的源码情况下,仍然可以打开这个类,并可以向该类添加新的函数

例如给定一串字符串,里面各种字符都有,而我们需要写个函数,从该字符串中删除除了英文字母之外的字符,得到一个新的字符串,通过我们会写个工作类,然后写个静态方法,调用其静态方法实现;但在Kotlin中,其支持我们向String类中添加一个扩展函数,在使用的时候,即可直接调用其方法实现

首先,编写扩展函数的时候,我们需要创建一个File文件,类似顶层方法的写法,文件名建议尽量与被扩展的类的类名一致

其次,定义扩展函数的时候,需要在方法名前加上被扩展的类名,例如String类

此时,定义完String扩展函数后,那么函数中就拥有了该String实例的上下文,因此该函数就不需要接收一个字符串参数了,而是直接遍历this即可,因为现在this代表着字符串本身

    // 在String.kt文件中定义fun String.filterChar(): String {val sb = StringBuilder()for (char in this) {if (char.isLetter()) {sb.append(char)}}return sb.toString()}// 在main方法中使用fun main(args: Array<String>) {println("123abcde456".filterChar())// 打印结果为:abcde}

5. 运算符重载

在Kotlin中,允许我们对运算符进行重载,运算符重载使用的是operator关键字,只要在指定函数前面加上operator关键字,就可以实现运算符重载的功能,例如我们对String类的times()方法进行重载,实现重复打印n次

步骤与扩展函数编写类似

首先,创建一个File文件,定义一个扩展函数,该函数即是times(),并在该方法前加上operator的关键字修饰

随后,在main函数中,直接通过调用.times(n)方式直接调用

    // 在String.kt文件中,定义一个扩展函数,并也是运算符*对应的函数operator fun String.times(count: Int) = repeat(count)// 在main方法中调用fun main(args: Array<String>) {println("abc".times(3))// 打印结果为:abcabcabc}

Kotlin学习2—函数的使用相关推荐

  1. Kotlin学习之函数

    函数声明 在kotlin中用关键字fun声明函数: fun double(x:Int):Int{ } 其中Int是返回值类型,x指明参数类型是为Int 函数用法 通过传统方法调用函数: val res ...

  2. Kotlin学习笔记-----函数的定义

    函数定义 kotlin的函数其实就是java中的方法, 名字不一样, 定义方式和java中也类似, 函数名(方法名), 参数, 返回值 区别在于, kotlin的函数定义需要加上fun, 这里和jav ...

  3. kotlin学习之函数(二)

    目录 1. 顶层函数和属性 2. 扩展函数 3. 扩展属性 4. 局部函数 这一节主要介绍顶层函数和属性,扩展函数和属性的原理,理解它们与Java的区别,并提出局部函数的概念 1. 顶层函数和属性 顶 ...

  4. kotlin学习目录

    目录 kotlin学习之基础(一) kotlin学习之函数(二) kotlin学习之类(三) kotlin学习之类的扩展(四) kotlin学习之密封类(五) kotlin学习之嵌套类和内部类(六) ...

  5. Kotlin学习历程——对象声明与伴生对象

    Kotlin语言中文站 对象声明 如下代码写法称为对象声明: object UserInfoManager {//用户类型val userType : Int = 0//获取用户登录信息fun get ...

  6. Kotlin学习(七):函数

    Kotlin学习(七):函数 函数基本用法 Kotlin 函数必须用 fun 关键字开头,后面紧跟着函数名,以及一对小括号,小括号中是函数参数列表,如果函数有返回值,在小括号后面加冒号 (:),冒号后 ...

  7. Kotlin学习笔记1——变量、函数

    Kotlin学习笔记1 (学习教材为<第一行代码(第三版)>by郭霖) 1.Kotlin概述 ​ Java虚拟机不关心class文件的编译来源,即只要是符合规格的class文件,Java虚 ...

  8. Kotlin学习篇(2)—— Kotlin的函数

    目录 1. 定义一个函数 2. 表达式函数体 3. 更简洁的使用函数 3.1 命名参数 3.2 默认参数值 4. 顶层函数 5. 扩展函数 6. 可变参数 7. 展开运算符 8. 集合相关的函数 9. ...

  9. Kotlin学习笔记(3)- 语法

    系列文章全部为本人的学习笔记,若有任何不妥之处,随时欢迎拍砖指正.如果你觉得我的文章对你有用,欢迎关注我,我们一起学习进步!kotlin学习笔记系列首发简书和CSDN Kotlin学习笔记(1)- 环 ...

最新文章

  1. 我所了解的Linux运维技术
  2. msiexec 命令使用文档
  3. 关于Java中final关键字的详细介绍
  4. 好好珍惜今生,不要期待来世……
  5. jupyter kernel_如何在Jupyter笔记本中运行Scala和Spark
  6. Android开发笔记(一百二十九)使用变换图形
  7. java如何查看jar编译的jdk版本
  8. xshell怎么连接linux服务器,教你怎么使用xshell远程连接linux服务器
  9. 简单打印-快递单套打
  10. FFmpeg代码实现视频转jpg图片
  11. uniapp安卓创建桌面快捷方式
  12. openpyxl自动设置列宽
  13. A Game of Thrones(4)
  14. HFI脉振方波高频注入代码 增强滑膜esmo代码 配套有文档
  15. python 运行报错 Process finished with exit code -1073740791 (0xC0000409)
  16. git stash 暂存恢复和文件误删恢复
  17. python---合并两个excel表格内容
  18. 20 个短小精悍的 pandas 骚操作
  19. 保密局计算机网络的安全检查与防护,自治区网络安全检查组莅临图书馆检查指导工作...
  20. 大学本科计算机考试小抄,大学考试允许带小抄 一页开卷学生抄到手酸

热门文章

  1. mysql server nchar_SQL Server NChar数据类型
  2. 积木盒子再拿奖 创始人说资产、服务、品牌是关键
  3. C#之CAD二次开发(15) Ribbon交互界面实例
  4. php for调用数组元素,php中foreach语句如何用于数组元素
  5. 万亿移动支付产业的难点和痛点
  6. IPV6地址格式分析
  7. USACO-2017-JAN-金组 Cow Navigation
  8. MSF/CS框架提权姿势
  9. 基于微信新生报到小程序系统设计与实现 开题报告
  10. c语言制作猜数游戏教程,C语言实现猜数游戏