【Kotlin】运算符函数、解构函数、中缀函数

2024-03-14 17:44

本文主要是介绍【Kotlin】运算符函数、解构函数、中缀函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 一元运算符

1.1 符号和函数

符号函数
+aa.unaryPlus()
-aa.unaryMinus()
!aa.not()
a++a.dec()
a--a.inc()

1.2 案例

fun main() {var stu = Student("Tom", 13)println(-stu) // 打印: [moT, 31]
}class Student(var name: String, var age: Int) {operator fun unaryMinus(): Student {return Student(name.reversed(), age.toString().reversed().toInt())}override fun toString(): String {return "[$name, $age]"}
}

2 二元运算符

2.1 基础运算符

2.1.1 符号和函数

符号函数
a + ba.plus(b)
a - ba.minus(b)
a * ba.times(b)
a / ba.div(b)
a % ba.rem(b)
a..ba.rangeTo(b)
a..<ba.rangeUntil(b)
a in bb.contains(a)
a !in b!b.contains(a)

2.1.2 案例

fun main() {var stu1 = Student("Tom", 13)var stu2 = Student("Mary", 18)println(stu1 + stu2) // 打印: [TomMary, 31]
}class Student(var name: String, var age: Int) {operator fun plus(other: Student): Student {return Student(this.name + other.name, this.age + other.age)}override fun toString(): String {return "[$name, $age]"}
}

2.2 自增简化运算符

2.2.1 符号和函数

符号函数
a += ba.plusAssign(b)
a -= ba.minusAssign(b)
a *= ba.timesAssign(b)
a /= ba.divAssign(b)
a %= ba.remAssign(b)

        说明:如果类中同时定义了 plus 和 plusAssign 运算,a += b 就会产生歧义,因为 a += b 等价于 a = a + b,编译器不知道是执行 plus 函数还是 plusAssign 函数,就会编译报错,其他运算符同理。

2.2.2 案例

fun main() {var stu1 = Student("Tom", 13)var stu2 = Student("Mary", 18)stu1 += stu2println(stu1) // 打印: [TomMary, 31]
}class Student(var name: String, var age: Int) {operator fun plusAssign(other: Student): Unit {this.name += other.namethis.age += other.age}override fun toString(): String {return "[$name, $age]"}
}

2.3 比较运算符

2.3.1 符号和函数

符号函数
a > ba.compareTo(b)   > 0
a < ba.compareTo(b)   < 0
a >= ba.compareTo(b)   >= 0
a <= ba.compareTo(b)   <= 0

2.3.2 案例

fun main() {var stu1 = Student("Tom", 13)var stu2 = Student("Mary", 18)var res = stu1 >= stu2println(res) // 打印: false
}class Student(var name: String, var age: Int) {operator fun compareTo(other: Student): Int {return this.age - other.age}
}

3 括号运算符

3.1 小括号

3.1.1 符号和函数

符号函数
a()a.invoke()
a(i)a.invoke(i)
a(i, j)a.invoke(i, j)
a(i_1, ..., i_n)a.invoke(i_1, ..., i_n)

3.1.2 案例

fun main() {var stu = Student("Mary", 18)stu() // 打印: Maryvar age = stu(1) // 打印: aprintln(age) // 打印: 18
}class Student(var name: String, var age: Int) {operator fun invoke(): Unit {println(name)}operator fun invoke(i: Int): Int {println(name[i])return age}
}

3.2 中括号

3.2.1 符号和函数

符号函数
a[i]a.get(i)
a[i, j]a.get(i, j)
a[i_1, ..., i_n]a.get(i_1, ..., i_n)
a[i] = ba.set(i, b)
a[i, j] = ba.set(i, j, b)
a[i_1, ..., i_n] = ba.set(i_1, ..., i_n, b)

3.2.2 案例

fun main() {var stu = Student("Mary")println(stu[1]) // 打印: astu[1] = 'W'println(stu.name) // 打印: MWry
}class Student(var name: String) {operator fun get(i: Int): Char {return name[i]}operator fun set(i: Int, c: Char): Unit {name = name.substring(0, i) + c + name.substring(i + 1)}
}

4 解构函数

4.1 解构属性

fun main() {var stu = Student("Tom", 13)var (name, age) = stuprintln("$name, $age") // 打印: Tom, 13var (_, age2) = stu // 只需要部分参数, 其他参数可以使用_忽略掉
}class Student(var name: String, var age: Int) {operator fun component1() = nameoperator fun component2() = age
}

4.2 解构在 Lambda 表达式中的使用

        Lambda 表达式详细介绍见 → Lambda表达式。

fun main() {var stu = Student("Tom", 13)var myFun: (Student) -> Unit = {(name, age) ->println("$name, $age")}myFun(stu) // 打印: Tom, 13
}class Student(var name: String, var age: Int) {operator fun component1() = nameoperator fun component2() = age
}

5 中缀函数

        中缀函数是使用 infix 关键字标记的函数,在使用时,可以省略点和括号,如:位运算 shl 就是一个中缀函数。函数必须满足以下条件。

  • 必须是成员函数(不是顶层函数);
  • 只能有一个参数;
  • 参数不能有默认值。

         中缀函数调用的优先级低于算术运算符、类型转换和 rangeTo 运算符,高于布尔运算符(&&、||、is)。

fun main() {var stu = Student("Tom")stu play "basketball"
}class Student(var name: String) {infix fun play(str: String): Unit {println("$name play $str")}fun test() {// play "badminton" // 编译报错this play "badminton"}
}

        说明: 如果在类中使用中缀函数,必须明确函数的调用方(接收器)。

这篇关于【Kotlin】运算符函数、解构函数、中缀函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/809196

相关文章

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

postgresql使用UUID函数的方法

《postgresql使用UUID函数的方法》本文给大家介绍postgresql使用UUID函数的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录PostgreSQL有两种生成uuid的方法。可以先通过sql查看是否已安装扩展函数,和可以安装的扩展函数

MySQL字符串常用函数详解

《MySQL字符串常用函数详解》本文给大家介绍MySQL字符串常用函数,本文结合实例代码给大家介绍的非常详细,对大家学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql字符串常用函数一、获取二、大小写转换三、拼接四、截取五、比较、反转、替换六、去空白、填充MySQL字符串常用函数一、

MySQL中比较运算符的具体使用

《MySQL中比较运算符的具体使用》本文介绍了SQL中常用的符号类型和非符号类型运算符,符号类型运算符包括等于(=)、安全等于(=)、不等于(/!=)、大小比较(,=,,=)等,感兴趣的可以了解一下... 目录符号类型运算符1. 等于运算符=2. 安全等于运算符<=>3. 不等于运算符<>或!=4. 小于运

Kotlin Map映射转换问题小结

《KotlinMap映射转换问题小结》文章介绍了Kotlin集合转换的多种方法,包括map(一对一转换)、mapIndexed(带索引)、mapNotNull(过滤null)、mapKeys/map... 目录Kotlin 集合转换:map、mapIndexed、mapNotNull、mapKeys、map

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每

全面掌握 SQL 中的 DATEDIFF函数及用法最佳实践

《全面掌握SQL中的DATEDIFF函数及用法最佳实践》本文解析DATEDIFF在不同数据库中的差异,强调其边界计算原理,探讨应用场景及陷阱,推荐根据需求选择TIMESTAMPDIFF或inte... 目录1. 核心概念:DATEDIFF 究竟在计算什么?2. 主流数据库中的 DATEDIFF 实现2.1