假设我有一个巨大的 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?
注意:我从评论和回答中学到了很多东西。谢谢大家!
Stream
很酷,但不是。BitSet
(及其按位的原子对应AtomicBitSet
)更适合于此(因此被接受为答案;谢谢其他人)。- 不鼓励
map
(Stream
或一般的函数式编程)中的副作用。 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/