如何在 Kotlin 中获取布尔数组中的真实计数

Sam*_*hen 1 java kotlin

我已经阅读了 kotlin 文档并尝试了BooleanArray.count(predicate: (Boolean) -> Boolean),但它仍然返回 的大小,而array不是数量true

val checks = arrayOf(true, false, true, true, true)

val trueCount = checks.count { true }
Run Code Online (Sandbox Code Playgroud)

我的代码有什么问题?

Jon*_*eet 8

您传入的谓词将始终在此处返回 true:

val trueCount = checks.count { true }
Run Code Online (Sandbox Code Playgroud)

这确实会返回数组的大小。我希望你的代码是:

val trueCount = checks.count { it }
Run Code Online (Sandbox Code Playgroud)

换句话说,“对于名为 的项目it,表达式it返回真”的项目计数。

可能会发现另一种更容易阅读的替代方法是明确检查相等性:

val trueCount = checks.count { it == true }
Run Code Online (Sandbox Code Playgroud)

就我个人而言,我倾向于避免与布尔文字进行比较,但我可以看到在这种情况下它至少可以说更清晰。

  • 考虑 `checks.count { it == true }` 可能会有所帮助:它清楚地计算您想要的内容,但与更简洁的 `checks.count { it }` 具有相同的效果。 (2认同)

Sam*_*Sam 5

使用count { it }代替count { true }

的参数count不是要在数组中查找的值;它是一个谓词:一个接受一个参数并返回trueor的函数false。该谓词对数组中的每个项目调用一次,该谓词返回的值(truefalse)决定了该项目是否被计数。所以结果是数组中谓词求值为 的项数。true

在这种情况下,写作{ true }是 的简写{ value -> true },并且是一个常数函数。true无论是什么,它都会返回value。因此,“计算{ true }返回的项目数true“计算项目数完全相同。

相反,您想要的是计算值为 的项目数true。您应该使用的谓词是{ value -> value },它是一个接受单个参数并返回该参数值的函数。由于单个 lambda 参数it在您不为其命名被隐式命名,因此其简写{ value -> value }就是{ it }.