如何从 Java Stream 创建布尔数组(boolean[])

java stream 的 `toarray()` 默认返回 `object[]`,无法直接转为原始类型数组 `boolean[]`,需使用带生成器的重载方法或中间转换。

在 Java 中,Stream 的 toArray() 方法有两个重载版本:

  • toArray():返回 Object[](即使流中元素是装箱类型如 Boolean),无法强制转换为 boolean[],因为原始类型数组与引用类型数组在 JVM 中是完全不同的类型,不存在继承关系;
  • toArray(IntFunction generator):接收一个数组构造函数(如 boolean[]::new),由 Stream 自动调用以创建并填充指定类型的数组——这是解决该问题的标准、高效且类型安全的方式

✅ 正确写法(推荐):

List class1List = /* ... */;
boolean[] isAvailableArray = class1List.stream()
    .mapToBoolean(Class1::isAvailable)  // 关键:使用 mapToBoolean 转为 BooleanStream
    .toArray();                         // BooleanStr

eam.toArray() 直接返回 boolean[]

⚠️ 注意:必须使用 mapToBoolean(而非 map),因为只有原始类型专用流(如 BooleanStream、IntStream)才提供返回对应原始数组的 toArray() 方法。若误用 map(e -> e.isAvailable()),得到的是 Stream,其 toArray() 仍返回 Object[],此时需手动指定生成器:

? 替代方案(不推荐,冗余且低效):

Boolean[] boxedArray = class1List.stream()
    .map(Class1::isAvailable)
    .toArray(Boolean[]::new);
boolean[] isAvailableArray = Arrays.stream(boxedArray)
    .mapToBoolean(Boolean::booleanValue)
    .toArray();

? 总结:

  • ❌ stream().map(...).toArray() → 总是 Object[],强转 boolean[] 编译失败;
  • ✅ stream().mapToBoolean(...).toArray() → 直接生成 boolean[],零开销、语义清晰;
  • ⚠️ 避免先收集为 Boolean[] 再转换,徒增内存与性能开销;
  • 所有原始类型流(IntStream、LongStream、DoubleStream、BooleanStream)均遵循相同规则:仅其专属 toArray() 方法可返回对应原始数组。