Kotlin 操作符与集合/数组方法详解——新手指南

188 阅读3分钟

Kotlin 提供丰富的操作符和扩展方法,简化集合操作、范围判断、内容比较等场景的代码。以下是核心操作符和方法的详细说明及示例:

一、基础操作符

1. !=(非等于)

  • 作用:判断两个对象是否不相等(基于 equals() 方法)。

  • 示例代码

    val a = "Kotlin"
    val b = "Java"
    println(a != b) // true(调用 a.equals(b) 的否定)
    

2. in 和 !in(成员操作符)

  • 作用:判断元素是否在集合或范围内存在。

  • 示例代码

    val list = listOf(1, 2, 3)
    val range = 1..10
    
    println(2 in list)    // true
    println(5 !in range)  // false
    

3. 范围操作符(..untilstep

  • 语法

    1..10       // 闭区间 [1, 10]
    1 until 10  // 左闭右开 [1, 10)
    10 downTo 1 step 2 // 步长为2的倒序区间
    
  • 示例代码

    for (i in 1..5 step 2) {
        print("$i ") // 输出:1 3 5 
    }
    

二、比较操作符

1. compareTo(比较大小)

  • 作用:实现 Comparable 接口的类可定义比较逻辑。

  • 示例代码

    class Person(val age: Int) : Comparable<Person> {
        override fun compareTo(other: Person) = this.age - other.age
    }
    
    val p1 = Person(25)
    val p2 = Person(30)
    println(p1 < p2)  // true(等价于 p1.compareTo(p2) < 0)
    

2. equals(逻辑相等)

  • 作用:判断对象内容是否相等(默认基于引用,数据类自动生成基于属性的实现)。

  • 示例代码

    data class User(val name: String, val id: Int)
    val u1 = User("Alice", 1)
    val u2 = User("Alice", 1)
    println(u1 == u2) // true(数据类自动生成 equals)
    

3. contentEquals(内容相等)

  • 作用:比较数组或集合的内容是否相同。

  • 示例代码

    val arr1 = arrayOf(1, 2, 3)
    val arr2 = arrayOf(1, 2, 3)
    println(arr1.contentEquals(arr2)) // true(内容相同)
    println(arr1 == arr2)             // false(引用不同)
    

三、集合操作

1. sort(排序)

  • 作用:对可变集合(如 MutableList)进行原地排序。

  • 示例代码

    val numbers = mutableListOf(3, 1, 4, 2)
    numbers.sort()                    // 自然排序
    numbers.sortDescending()          // 逆序排序
    numbers.sortBy { it % 3 }         // 自定义排序
    

2. binarySearch(二分查找)

  • 前提:集合必须已排序。

  • 示例代码

    val sortedList = listOf(10, 20, 30, 40, 50)
    val index = sortedList.binarySearch(30) // 返回索引 2
    

四、数组操作

1. sort(数组排序)

  • 示例代码

    val arr = arrayOf(5, 3, 1, 4, 2)
    arr.sort()                          // 原地排序:[1, 2, 3, 4, 5]
    val sortedArr = arr.sortedArray()   // 生成新数组
    

2. 其他数组方法

  • 内容比较

    val a1 = intArrayOf(1, 2, 3)
    val a2 = intArrayOf(1, 2, 3)
    println(a1.contentEquals(a2))       // true
    
  • 填充与复制

    val arr = IntArray(5) { it }
    arr.fill(0)                         // 所有元素置0
    val copy = arr.copyOf()             // 深拷贝
    

五、操作符重载与自定义行为

1. 自定义 in 操作符

  • 实现:在类中定义 contains 方法。

    class Week(private val days: List<String>) {
        operator fun contains(day: String) = day in days
    }
    val week = Week(listOf("Mon", "Tue", "Wed"))
    println("Tue" in week) // true
    

2. 自定义比较逻辑

  • 覆写 equals

    class Product(val name: String) {
        override fun equals(other: Any?): Boolean {
            return (other as? Product)?.name?.startsWith("A") ?: false
        }
    }
    val p1 = Product("Apple")
    val p2 = Product("Banana")
    println(p1 == p2) // false(仅比较名称是否以 A 开头)
    

六、总结对比

操作符/方法核心作用适用场景
!=非相等判断(基于 equals()所有对象比较
in / !in成员存在性检查集合、范围、自定义类
.. / until定义数值范围循环、区间判断
compareTo对象大小比较排序、自定义顺序
contentEquals数组/集合内容比较数组或集合的深比较
sort原地排序可变集合/数组
binarySearch快速查找元素位置已排序集合

通过合理使用这些操作符和方法,可以显著提升 Kotlin 代码的简洁性和可读性! 🚀

更多分享

  1. 一文吃透Kotlin中冷流(Clod Flow)和热流(Hot Flow)
  2. 一文带你吃透Kotlin协程的launch()和async()的区别
  3. Kotlin 委托与扩展函数——新手入门
  4. Kotlin 作用域函数(let、run、with、apply、also)的使用指南
  5. 一文带你吃透Kotlin中 lateinit 和 by lazy 的区别和用法
  6. Kotlin 扩展方法(Extension Functions)使用详解
  7. Kotlin 中 == 和 === 的区别