java - 检查是否全部为真并使用 Java 8 的单行 lambda 表达式重置 boolean [] 数组

标签 java arrays lambda java-8 java-stream

假设我有一个巨大的 Boolean 数组flags:

Boolean[] flags = { true, false, true };    // 3 means "many"

我想在 flags 上做两件事:

  • 检查所有元素是否为true并返回一个指标;
  • 将所有元素重置为 false

使用 Java 8 的 lambda 表达式,我可以按如下方式进行:

indicator = Arrays.stream(flags).allMatch(flag -> flag);
Arrays.stream(flags).forEach(flag -> flag = false);
return indicator;

然而,此实现会扫描 flags 两次。由于 flags 很大,我不想要这个。此外,我更喜欢 lambda 方式。有没有什么方法可以用(单行)lambda 表达式实现这个 checkIfAllTrueAndReset 语义,它只扫描一次 flags


相关但不相同:What is the most elegant way to check if all values in a boolean array are true?


注意:我从评论和回答中学到了很多东西。谢谢大家!

  1. Stream 很酷,但不是
  2. BitSet(及其按位的原子对应 AtomicBitSet )更适合于此(因此被接受为答案;谢谢其他人)。
  3. 不鼓励 map(Stream 或一般的函数式编程)中的副作用。
  4. Arrays.stream(flags).forEach(flag -> flag = false)(在我的代码中)没有设置任何东西!

最佳答案

使用 BitSet 的经典示例类:

This class implements a vector of bits that grows as needed. Each component of the bit set has a boolean value.

在复杂性方面,BitSet 为每个 boolean 值使用 ~1 位,这比使用大型 Boolean 对象数组要好得多。

关于检查所有位是否已设置(true 或 false),API 提供了许多有用的方法 - 而且它们非常有效。

关于java - 检查是否全部为真并使用 Java 8 的单行 lambda 表达式重置 boolean [] 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34493660/

相关文章:

c# - 用于自定义排序列表的 Lambda 表达式

C# 不能在匿名方法体内使用 ref 或 out 参数

java - lambda 中的 Spring Request 作用域 bean

java - 在 https 中使用证书

java - ArrayIndexOutofBoundException - Java - Android - 接收流数据并存储在多维数组中 Java

java - 传递订单

javafx fxml LoadException

c++ - 在 C++ 中评估基于矩阵的多项式的最佳方法

javascript - 从回调函数内部访问 2D 数组 jquery 元素的索引

c++ - 分配数组而不指定大小