User-Profile-Image
hankin
  • 5
  • Java
  • Kotlin
  • Spring
  • Web
  • SQL
  • MegaData
  • More
  • Experience
  • Enamiĝu al vi
  • 分类
    • Zuul
    • Zookeeper
    • XML
    • WebSocket
    • Web Notes
    • Web
    • Vue
    • Thymeleaf
    • SQL Server
    • SQL Notes
    • SQL
    • SpringSecurity
    • SpringMVC
    • SpringJPA
    • SpringCloud
    • SpringBoot
    • Spring Notes
    • Spring
    • Servlet
    • Ribbon
    • Redis
    • RabbitMQ
    • Python
    • PostgreSQL
    • OAuth2
    • NOSQL
    • Netty
    • MySQL
    • MyBatis
    • More
    • MinIO
    • MegaData
    • Maven
    • LoadBalancer
    • Kotlin Notes
    • Kotlin
    • Kafka
    • jQuery
    • JavaScript
    • Java Notes
    • Java
    • Hystrix
    • Git
    • Gateway
    • Freemarker
    • Feign
    • Eureka
    • ElasticSearch
    • Docker
    • Consul
    • Ajax
    • ActiveMQ
  • 页面
    • 归档
    • 摘要
    • 杂图
    • 问题随笔
  • 友链
    • Spring Cloud Alibaba
    • Spring Cloud Alibaba - 指南
    • Spring Cloud
    • Nacos
    • Docker
    • ElasticSearch
    • Kotlin中文版
    • Kotlin易百
    • KotlinWeb3
    • KotlinNhooo
    • 前端开源搜索
    • Ktorm ORM
    • Ktorm-KSP
    • Ebean ORM
    • Maven
    • 江南一点雨
    • 江南国际站
    • 设计模式
    • 熊猫大佬
    • java学习
    • kotlin函数查询
    • Istio 服务网格
    • istio
    • Ktor 异步 Web 框架
    • PostGis
    • kuangstudy
    • 源码地图
    • it教程吧
    • Arthas-JVM调优
    • Electron
    • bugstack虫洞栈
    • github大佬宝典
    • Sa-Token
    • 前端技术胖
    • bennyhuo-Kt大佬
    • Rickiyang博客
    • 李大辉大佬博客
    • KOIN
    • SQLDelight
    • Exposed-Kt-ORM
    • Javalin—Web 框架
    • http4k—HTTP包
    • 爱威尔大佬
    • 小土豆
    • 小胖哥安全框架
    • 负雪明烛刷题
    • Kotlin-FP-Arrow
    • Lua参考手册
    • 美团文章
    • Java 全栈知识体系
    • 尼恩架构师学习
    • 现代 JavaScript 教程
    • GO相关文档
    • Go学习导航
    • GoCN社区
    • GO极客兔兔-案例
    • 讯飞星火GPT
    • Hollis博客
    • PostgreSQL德哥
    • 优质博客推荐
    • 半兽人大佬
    • 系列教程
    • PostgreSQL文章
    • 云原生资料库
    • 并发博客大佬
Help?

Please contact us on our email for need any support

Support
    首页   ›   Kotlin   ›   Kotlin Notes   ›   正文
Kotlin Notes

Kotlin-表达式—运算符与中缀表达式(十三)

2021-01-14 00:52:30
698  0 1
参考目录 隐藏
1) Kotlin 运算符重载
2) 赋值运算符
3) 一元前缀 和 递增/递减运算符
4) 比较运算符 和 相等运算符
5) 逻辑运算符
6) in 运算符
7) 索引访问运算符
8) invoke 运算符
9) 按位运算
10) 中缀函数(infix)
11) 如何创建带有中缀符号的函数?

阅读完需:约 7 分钟

Kotlin 运算符重载

在Kotlin中使用operator时,将调用它的相应成员函数。 例如,表达式a + b在后台转换为a.plus(b)。

fun main(args: Array<String>) {
    val a = 5
    val b = 10

    print(a.plus(b)) // print(a+b)
}

实际上,plus()函数被重载以处理各种Kotlin基本类型和String(字符串)。

// + 基本类型的运算符
operator fun plus(other: Byte): Int
operator fun plus(other: Short): Int
operator fun plus(other: Int): Int
operator fun plus(other: Long): Long
operator fun plus(other: Float): Float
operator fun plus(other: Double): Double

//用于字符串连接
operator fun String?.plus(other: Any?): String

您还可以通过重载相应的函数来定义运算符对对象的工作方式。 例如,您需要通过重载plus()函数来定义+运算符对对象的工作方式。

fun main(args: Array<String>) {
    val p1 = Point(3, -8)
    val p2 = Point(2, 9)

    var sum = Point()
    sum = p1 + p2

    println("sum = (${sum.x}, ${sum.y})")
}

class Point(val x: Int = 0, val y: Int = 10) {

    //重载 plus 函数
    operator fun plus(p: Point) : Point {
        return Point(x + p.x, y + p.y)
    }
}

在此,plus()函数用 operator 关键字标记,以告知编译器 + 运算符正在重载。

表达式 p1 + p2 在后台转换为 p1.plus(p2)。

这是算术运算符及其相应函数的列表:

表达式 函数名称 用法
a + b 加 a.plus(b)
a-b 减 a.minus(b)
a * b 乘
a.times(b)
a / b 除
a.div(b)
a%b 求模 a.mod(b)

赋值运算符

赋值运算符用于为变量赋值。我们之前已经使用过简单的 = 赋值运算符。

以下是所有赋值运算符及其对应函数的列表:

表达式 相当于 用法
a + = b a = a + b a.plusAssign(b)
a-= b a = a-b a.minusAssign(b)
a * = b a = a * b a.timesAssign(b)
a / = b a = a / b a.divAssign(b)
a%= b a = a%b a.modAssign(b)
fun main(args: Array<String>) {
    var number = 12

    number *= 5   // number = number*5
    println("number  = $number")
}

一元前缀 和 递增/递减运算符

这是一元运算符,它们的含义和相应功能的表:

运算符 描述 表达式 用法
+ 一元加 +a a.unaryPlus()
– 一元减 -a a.unaryMinus()
! 不是(反转值) !a a.not()
++ 递增:值加1 ++a a.inc()
— 递减:值减1 –a
a.dec()
fun main(args: Array<String>) {
    val a = 1
    val b = true
    var c = 1

    var result: Int
    var booleanResult: Boolean

    result = -a
    println("-a = $result")

    booleanResult = !b
    println("!b = $booleanResult")

    --c
    println("--c = $c")
}

返回:

-a = -1
!b = false
--c = 0

比较运算符 和 相等运算符

这是一个相等和比较运算符,它们的含义以及相应函数的列表:

运算符 描述 表达式 用法
> 大于 a> b a.compareTo(b)> 0
< 小于 a <b a.compareTo(b)<0
> = 大于 或 等于 a> = b a.compareTo(b)>= 0
<= 小于 或 等于 a <= b a.compareTo(b)<= 0
== 等于 a == b a?.equals(b)?:(b === null)
!= 不等于 a!= b !(a?.equals(b)?:(b ===null))

比较和相等运算符用于控制流,例如:if 表达式,when表达式 和 循环。

fun main(args: Array<String>) {

    val a = -12
    val b = 12

    //使用大于运算符
    val max = if (a > b) {
        println("a大于b")
        a
    } else {
        println("b大于a")
        b
    }

    println("max = $max")
}

逻辑运算符

Kotlin中有两个逻辑运算符:|| 和 &&

这是逻辑运算符,它们的含义和相应函数的表。

运算符 描述 表达式 对应函数
|| 如果任一布尔表达式为true,则为true
(a>b)||(a<c) (a>b)or(a<c)
&& 如果所有布尔表达式均为true,则为true (a>b)&&(a<c) (a>b)and(a<c)

请注意,or 和 and 是支持中缀表示法的函数。

逻辑运算符用于控制流,例如 if表达式,when表达式 和 循环。

fun main(args: Array<String>) {

    val a = 10
    val b = 9
    val c = -1
    val result: Boolean

    // result 为 true 是最大
    result = (a>b) && (a>c) // result = (a>b) and (a>c)
    println(result)
}

in 运算符

in运算符用于检查一个对象是否属于一个集合。

运算符 表达式 用法
in
a in b b.contains(a)
!in
a !in b
!b.contains(a)
fun main(args: Array<String>) {

    val numbers = intArrayOf(1, 4, 42, -3)

    if (4 in numbers) {
        println("numbers 数组包含 4.")
    }
}

索引访问运算符

以下是在Kotlin中使用带有相应函数的索引访问运算符的一些表达式。

表达 用法
a[i] a.get(i)
a[i, n] a.get(i, n)
a[i1, i2, …, in] a.get(i1, i2, …, in)
a[i] = b a.set(i, b)
a[i, n] = b a.set(i, n, b)
a[i1, i2, …, in] = b a.set(i1, i2, …, in, b)
fun main(args: Array<String>) {

    val a  = intArrayOf(1, 2, 3, 4, - 1)
    println(a[1])   
    a[1]= 12
    println(a[1])
}

invoke 运算符

以下是Kotlin中使用带有相应函数的invoke运算符的一些表达式。

表达 翻译成
a() a.invoke()
a(i) a.invoke(i)
a(i1, i2, …, in) a.inkove(i1, i2, …, in)
a[i] = b a.set(i, b)

在Kotlin中,括号被转换为调用invoke成员函数。


按位运算

与Java不同,Kotlin中没有按位和移位运算符。为了执行这些任务,使用了各种功能(支持中缀符号):

  • shl – 签名左移
  • shr – 右移签名
  • ushr – 无符号右移
  • and – 按位与
  • or – 按位或
  • xor – 按位异或
  • inv – 按位反

中缀函数(infix)

在学习如何创建具有中缀符号的函数之前,让我们先研究两个常用的中缀函数。

使用 || 和 &&& 操作时,编译器分别查找 or 和 and 函数,并在后台调用它们。这两个函数支持中缀表示法。

fun main(args: Array<String>) {
    val a = true
    val b = false
    var result: Boolean

    result = a or b // a.or(b)
    println("result = $result")

    result = a and b // a.and(b)
    println("result = $result")
}

运行该程序时,输出为:

result = true
result = false

在上面的程序中,使用a or b 代替 a.or(b),并使用 a and b 代替 a.and(b)。 这是允许的,因为这两个函数支持中缀表示法。

如何创建带有中缀符号的函数?

您可以使用中缀表示法在Kotlin中进行函数调用,如果函数

  • 是成员函数(或扩展函数)。
  • 只有一个参数。
  • 标有 infix 关键字。
class Structure() {

    infix fun createPyramid(rows: Int) {
        var k = 0
        for (i in 1..rows) {
            k = 0
            for (space in 1..rows-i) {
                print("  ")
            }
            while (k != 2*i-1) {
                print("* ")
                ++k
            }
            println()
        }
    }
}

fun main(args: Array<String>) {
    val p = Structure()
    p createPyramid 4       // p.createPyramid(4)
}

运行该程序时,输出为:

      * 
    * * * 
  * * * * * 
* * * * * * *

例子二:

infix fun String.rotate(count: Int): String {
    val index = count % length
    return this.substring(index) + this.substring(0, index)
}

println("HelloWorld" rotate 5)

如本文“对您有用”,欢迎随意打赏作者,让我们坚持创作!

1 打赏
Enamiĝu al vi
不要为明天忧虑.因为明天自有明天的忧虑.一天的难处一天当就够了。
543文章 68评论 294点赞 593712浏览

随机文章
SpringBoot—SpringSecurity(角色继承问题)
5年前
Java—IO读写文件的方式
5年前
MyBatis笔记13—一对一查询
5年前
Kotlin-表达式—运算符与中缀表达式(十三)
4年前
MyBatis笔记3—增删改查
5年前
博客统计
  • 日志总数:543 篇
  • 评论数目:68 条
  • 建站日期:2020-03-06
  • 运行天数:1927 天
  • 标签总数:23 个
  • 最后更新:2024-12-20
Copyright © 2025 网站备案号: 浙ICP备20017730号 身体没有灵魂是死的,信心没有行为也是死的。
主页
页面
  • 归档
  • 摘要
  • 杂图
  • 问题随笔
博主
Enamiĝu al vi
Enamiĝu al vi 管理员
To be, or not to be
543 文章 68 评论 593712 浏览
测试
测试
看板娘
赞赏作者

请通过微信、支付宝 APP 扫一扫

感谢您对作者的支持!

 支付宝 微信支付