1. 概述

Boolean 是编程中最基础的数据类型之一,仅包含两个取值:truefalse

在实际开发中,我们有时需要将布尔值转换为整数,例如把 true 映射为 1false 映射为 0。这种转换在统计、位运算或与数据库交互时尤为常见。

本文将介绍在 Kotlin 中实现 Boolean → Int 转换的两种实用方式,并结合代码示例说明其适用场景和注意事项,帮助你在项目中灵活选择方案,避免重复造轮子。

2. 问题背景

为什么我们需要把布尔值转成整数?来看一个典型场景:

假设你有一个 List<Boolean>,想快速统计其中 true 的数量。如果能先将每个 true 变成 1false 变成 0,那么直接调用 .sum() 就能得到结果:

val booleans = listOf(true, false, true, true)
val countTrue = booleans.map { if (it) 1 else 0 }.sum() // 结果为 3

虽然可以内联处理,但代码不够优雅。更理想的方式是:

val countTrue = booleans.map { it.toInt() }.sum()

这就引出了我们的核心需求:如何让 Boolean 原生支持转 Int

下面我们介绍两种主流做法,均通过单元测试验证正确性(使用 AssertJ 风格断言)。

3. 使用 Kotlin 扩展函数/属性 ✅

Kotlin 的扩展机制是提升 API 流畅性的利器。我们无需继承或修改原始类,就能为 Boolean 添加新行为。

3.1 扩展函数:toInt()

定义一个扩展函数,让所有 Boolean 实例都能调用 .toInt()

fun Boolean.toInt() = if (this) 1 else 0

这样就可以链式调用了,比如:

complex().calls().to().getBoolean().toInt()

测试验证:

assertThat(true.toInt()).isEqualTo(1)
assertThat(false.toInt()).isEqualTo(0)

✅ 测试通过,语义清晰,调用自然。

3.2 扩展属性:intValue

除了函数,还可以定义只读扩展属性:

val Boolean.intValue
    get() = if (this) 1 else 0

使用方式更像字段访问:

assertThat(true.intValue).isEqualTo(1)
assertThat(false.intValue).isEqualTo(0)

⚠️ 注意:扩展属性不能有 backing field,所以只能定义 get()

优缺点分析

方式 优点 缺点
扩展函数 toInt() 符合命名习惯,易于理解 每个项目需手动定义
扩展属性 intValue 访问语法简洁,无括号干扰 不符合标准库风格,可能引起混淆

💡 踩坑提示:如果你经常在多个项目中使用这类转换,建议封装成公共库模块,避免重复粘贴代码。

4. 利用 compareTo() 方法巧转化 ⚡

你可能没注意到:Boolean 类其实实现了 Comparable<Boolean> 接口:

public class Boolean private constructor() : Comparable<Boolean> { ... }

这意味着我们可以比较两个布尔值。在 Kotlin 中:

true > false 为真
false > true 为假

进一步地,compareTo() 的返回规则如下:

  • a > b → 返回 1
  • a == b → 返回 0
  • a < b → 返回 -1

关键来了:由于 true > false,因此:

true.compareTo(false)  // 返回 1
false.compareTo(false) // 返回 0

这正好满足我们 true → 1, false → 0 的映射需求!

测试验证:

assertThat(true.compareTo(false)).isEqualTo(1)
assertThat(false.compareTo(false)).isEqualTo(0)

✅ 完美匹配!

为什么不比较 compareTo(true)

试试看:

assertThat(true.compareTo(true)).isEqualTo(0)
assertThat(false.compareTo(true)).isEqualTo(-1)

结果是 0-1,不符合我们想要的非负整数输出。因此必须和 false 比较才能得到 [0, 1] 区间的结果。

优缺点对比

特性 说明
✅ 无需额外代码 直接利用标准库能力
✅ 零依赖 不引入任何自定义函数
⚠️ 可读性差 b.compareTo(false) 不如 b.toInt() 直观
❌ 易误解 新人可能看不懂意图,需加注释

📌 建议使用场景:临时脚本、性能敏感代码段、不想增加扩展函数的轻量项目。

5. 总结

本文介绍了两种将 Boolean 转换为 Int 的方法:

方法 是否推荐 适用场景
Kotlin 扩展函数 toInt() ✅ 强烈推荐 日常开发,追求可读性和流畅 API
扩展属性 intValue ⚠️ 可选 喜欢属性风格访问者
compareTo(false) 技巧 ⚡ 特殊情况可用 减少依赖、避免定义辅助函数时

最终选择哪种方式,取决于团队编码规范和个人偏好。但从长期维护角度看,封装一个清晰命名的扩展函数是最稳妥的选择

示例完整源码见:GitHub - Baeldung/kotlin-tutorials


原始标题:Convert Boolean to Int in Kotlin