BitSet.stream() 返回按升序排列的真值索引IntStream,空BitSet返回空流,支持延迟求值与链式处理,性能线性于真值数量而非位宽。

BitSet.stream() 是 Java 8 引入的便捷方法,它直接返回一个 IntStream,其中每个元素是 BitSet 中值为 true 的位的索引(即“置位”的位置),无需手动遍历或过滤。这是最简洁、高效的方式将真值索引转为整数流。
理解 BitSet.stream() 的行为
该方法按升序返回所有被设置为 true 的位的索引(从 0 开始)。未设置的位(false)完全不出现,也不需要额外判断。
- 空 BitSet 调用
stream()返回空流(不会抛异常) - 索引从 0 开始,与数组/位图逻辑一致
- 流是延迟求值的,适合链式处理(如 filter/map/forEach)
基础用法:获取并遍历真值索引
直接获取所有真值位置,并执行操作:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
BitSet bs = new BitSet(); bs.set(2); // 索引 2 → true bs.set(5); // 索引 5 → true bs.set(10); // 索引 10 → true bs.stream().forEach(System.out::println); // 输出:2, 5, 10(顺序保证)
结合 Stream API 进行常见处理
利用 IntStream 的丰富操作,可轻松完成筛选、转换、聚合等任务:
立即学习“Java免费学习笔记(深入)”;
-
只取前 N 个真值索引:
bs.stream().limit(2) -
跳过前几个再取:
bs.stream().skip(1).findFirst() -
映射为其他值(如加偏移):
bs.stream().map(i -> i + 1)(转为 1-based 索引) -
收集为 List 或数组:
bs.stream().boxed().collect(Collectors.toList())或bs.stream().toArray() -
统计真值个数:
bs.stream().count()(等价于bs.cardinality(),但语义更明确)
注意事项与常见误区
避免误用或性能陷阱:
- 不要写
bs.stream().filter(i -> bs.get(i))——stream()已保证只含true位,此过滤冗余且低效 - 若需反向遍历(降序),不能直接用
stream(),需先收集再反转,例如:bs.stream().boxed().collect(Collectors.toList()).reversed() - BitSet 内部可能稀疏(高位有 true 但中间大量 false),
stream()不会遍历未设置区域,因此性能与真值数量线性相关,而非最大索引

















