1. 概述
这是一个经典的编程小问题:如何判断一个整数是奇数还是偶数。在 Kotlin 中,我们可以通过取模运算(modulo operation)来轻松解决这个问题。核心思路是利用对 2 取余的结果:如果余数为 0,则是偶数;否则为奇数。
本文将重点讲解 Kotlin 中的 rem()
运算符及其使用方式,并通过实际代码示例展示如何高效实现奇偶判断。✅ 掌握这个技巧虽然简单,但在日常开发中频繁出现,比如分页、循环渲染、状态切换等场景,踩坑多了就会发现写个工具函数真的很有必要。
2. rem 运算符详解
Kotlin 提供了取余操作符 %
,底层对应的是 rem()
函数。和 Java 类似,x % y
实际上会被编译器翻译成 x.rem(y)
,这是 Kotlin 运算符重载机制的一部分。⚠️ 注意:Kotlin 1.1 版本之前曾使用 mod
表示该操作,但从 1.1 开始统一改为 rem()
,以更准确地反映其行为(详见更新日志)。
2.1 取模运算基础
先看几个典型的取余例子,确保理解其数学含义:
@Test
fun `Given the remainder function, assertions on the remainder should pass`() {
assertTrue(10 % 4 == 2)
assertTrue(25 % 5 == 0)
assertTrue(24 % 5 == 4)
assertTrue(100 % 20 == 0)
}
这些测试验证了基本的取余逻辑 —— 结果就是整除后剩下的部分。
2.2 判断奇偶性的实现
定义两个测试变量:
val a = 42
val b = 25
判断逻辑如下:
- 若
n % 2 == 0
→ 偶数 ✅ - 若
n % 2 == 1
→ 奇数 ❌
应用到具体数值:
@Test
fun `Given odd or even numbers should get the right response from rem`() {
val a = 42
val b = 25
val aRem2 = a % 2
val bRem2 = b % 2
val isAEven: Boolean = aRem2 == 0
val isBEven: Boolean = bRem2 == 0
assertTrue(isAEven)
assertFalse(isBEven)
}
基于此,我们可以封装两个简洁的工具函数:
fun isEven(value: Int) = value % 2 == 0
fun isOdd(value: Int) = value % 2 == 1
接着编写单元测试验证其正确性:
@Test
fun `Given odd and even values the isEven function should answer correctly`() {
assertTrue(isEven(2))
assertTrue(isEven(4))
assertTrue(isEven(6))
assertFalse(isEven(1))
assertFalse(isEven(3))
}
@Test
fun `Given odd and even values the isOdd function should answer correctly`() {
assertTrue(isOdd(1))
assertTrue(isOdd(3))
assertTrue(isOdd(5))
assertFalse(isOdd(2))
assertFalse(isOdd(4))
}
这两个扩展函数足够轻量,可以直接放入项目通用工具类中复用。如果你追求更优雅的 API,也可以考虑将其作为 Int
的扩展函数:
inline val Int.isEven: Boolean get() = this % 2 == 0
inline val Int.isOdd: Boolean get() = this % 2 != 0
这样调用时就变成了 42.isEven
或 25.isOdd
,语义更清晰,DSL 感更强。
3. 总结
本文介绍了 Kotlin 中的 rem()
操作及其对应的 %
符号,展示了如何通过取模 2 来判断整数的奇偶性。我们从基础运算出发,逐步封装出可复用的函数,并强调了其在实际编码中的实用性。
文中所有代码示例均可在 GitHub 获取:https://github.com/Baeldung/kotlin-tutorials/tree/master/core-kotlin-modules/core-kotlin-numbers-2