Java-8:boolean原始数组要流吗?

And*_*niy 23 java java-8 java-stream

没有很好的方法可以在一个语句中将给定boolean[] foo数组转换为Java-8 中的流,或者我错过了什么?

(我不会问为什么?,但实际上是不可理解的:为什么不为所有原始类型添​​加流支持?)

提示: Arrays.stream(foo)不起作用,没有这种boolean[]类型的方法.

Tag*_*eev 33

鉴于boolean[] foo使用

Stream<Boolean> stream = IntStream.range(0, foo.length)
                                  .mapToObj(idx -> foo[idx]);
Run Code Online (Sandbox Code Playgroud)

请注意,每个布尔值都将被装箱,但它通常不是一个大问题,因为装箱布尔值没有分配额外的内存(只使用预定义值之一 - Boolean.TRUEBoolean.FALSE).

  • @Mena,原因有很多.其中之一是代码爆炸:每个原始流都添加了大量的专用代码,更不用说在添加`IntStream.mapToBoolean`,`BooleanStream.mapToDouble`等时增加二次API.所以他们不得不停在某个地方.他们认为`int`,`long`和`double`是最有用的原始类型,所以这是一个合理的权衡.希望Java 10能为我们带来通用的专业化,而`Stream <boolean>`将开箱即用. (5认同)
  • 我想你可以得到关闭.但"好"是不同的 - 恕我直言.(1) (3认同)
  • 在您看来,可以安全地推断出`boolean`s上的"轻量级"装箱操作可能是为什么没有专门用于`boolean`s的原始流的原因? (2认同)

Zhe*_*lov 7

您可以使用番石榴的Booleans

Stream<Boolean> stream = Booleans.asList(foo).stream();
Run Code Online (Sandbox Code Playgroud)

这是一种非常有效的方法,因为Booleans.asList返回数组的包装器并且不制作任何副本。

  • @Tagir Valeev:[`List` 的默认拆分器](https://docs.oracle.com/javase/8/docs/api/java/util/List.html#spliterator--)“报告 Spliterator.SIZED 和Spliterator.Ordered”… (3认同)
  • @TagirValeev 我刚刚检查了`Booleans.asList()` 返回的拆分器的特征,它看起来像一个 SIZED 特征。 (2认同)
  • @Holger,对不起,我的错。那么唯一的问题是并行性。尽管它也在 Java-9 中[解决](https://bugs.openjdk.java.net/browse/JDK-8158365)。 (2认同)