【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

相关文章

Kotlin 作用域函数apply、let、run、with、also使用指南

《Kotlin作用域函数apply、let、run、with、also使用指南》在Kotlin开发中,作用域函数(ScopeFunctions)是一组能让代码更简洁、更函数式的高阶函数,本文将... 目录一、引言:为什么需要作用域函数?二、作用域函China编程数详解1. apply:对象配置的 “流式构建器”最

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

kotlin的函数forEach示例详解

《kotlin的函数forEach示例详解》在Kotlin中,forEach是一个高阶函数,用于遍历集合中的每个元素并对其执行指定的操作,它的核心特点是简洁、函数式,适用于需要遍历集合且无需返回值的场... 目录一、基本用法1️⃣ 遍历集合2️⃣ 遍历数组3️⃣ 遍历 Map二、与 for 循环的区别三、高

kotlin中的数据转换方法(示例详解)

《kotlin中的数据转换方法(示例详解)》这篇文章介绍了Kotlin中将数字转换为字符串和字符串转换为数字的多种方法,包括使用`toString()`、字符串模板、格式化字符串、处理可空类型等,同时... 目录1. 直接使用 toString() 方法2. 字符串模板(自动转换)3. 格式化字符串(控制输

C语言字符函数和字符串函数示例详解

《C语言字符函数和字符串函数示例详解》本文详细介绍了C语言中字符分类函数、字符转换函数及字符串操作函数的使用方法,并通过示例代码展示了如何实现这些功能,通过这些内容,读者可以深入理解并掌握C语言中的字... 目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现3.1strlen函数3.2st

kotlin中的行为组件及高级用法

《kotlin中的行为组件及高级用法》Jetpack中的四大行为组件:WorkManager、DataBinding、Coroutines和Lifecycle,分别解决了后台任务调度、数据驱动UI、异... 目录WorkManager工作原理最佳实践Data Binding工作原理进阶技巧Coroutine

Java逻辑运算符之&&、|| 与&、 |的区别及应用

《Java逻辑运算符之&&、||与&、|的区别及应用》:本文主要介绍Java逻辑运算符之&&、||与&、|的区别及应用的相关资料,分别是&&、||与&、|,并探讨了它们在不同应用场景中... 目录前言一、基本概念与运算符介绍二、短路与与非短路与:&& 与 & 的区别1. &&:短路与(AND)2. &:非短

kotlin中的模块化结构组件及工作原理

《kotlin中的模块化结构组件及工作原理》本文介绍了Kotlin中模块化结构组件,包括ViewModel、LiveData、Room和Navigation的工作原理和基础使用,本文通过实例代码给大家... 目录ViewModel 工作原理LiveData 工作原理Room 工作原理Navigation 工