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

时间:2017-02-14 11:30:05

标签: java java-8 java-stream

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

(我不会问为什么?,但实在是难以理解:为什么不为所有基本类型添加流支持?)

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

4 个答案:

答案 0 :(得分:32)

鉴于boolean[] foo使用

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

请注意,每个布尔值都会被装箱,但它通常不是一个大问题,因为用于布尔值的装箱不会分配额外的内存(只使用预定义值之一 - Boolean.TRUE或{{1} })。

答案 1 :(得分:4)

您可以使用Guava's Booleans class

Stream<Boolean> stream = Booleans.asList(foo).stream();

这是一种非常有效的方法,因为Booleans.asList返回数组的包装器而不进行任何复制。

答案 2 :(得分:0)

您当然可以直接创建流

Stream.Builder<Boolean> builder = Stream.builder();
for( int i = 0; i < foo.length; i++ )
  builder.add( foo[i] );
Stream<Boolean> stream = builder.build();

答案 3 :(得分:0)

通过最新java.base的早期访问JavaDoc(即模块)跳过,仍然没有使整型布尔数组与Stream一起工作的整洁方法 API在一起很好。自起,API中没有处理原始布尔数组的新功能

请注意,存在IntStreamDoubleStreamLongStream,但与BooleanStream一样,它都不表示原始布尔序列的变体。 Stream的重载方法还有Stream::mapToIntStream::mapToDoubleStream::mapToLong,但没有Stream::mapToBoolean返回这样的假设BooleanStream

Oracle似乎一直遵循这种模式,也可以在Collectors中找到该模式。也没有对float原语的支持(取而代之的是double原语)。我认为,与float不同,boolean支持将很有意义地实现。

回到代码...如果您有一个装箱的布尔数组(即Boolean[] array),事情就会变得容易起来:

Boolean[] array = ...
Stream<Boolean> streamOfBoxedBoolean1 = Arrays.stream(array);
Stream<Boolean> streamOfBoxedBoolean2 = Stream.of(array);

否则,您必须使用{em> thisthis答案中所述的多条语句

但是,您问(强调我的):

通过一个语句将给定的boolean[] foo数组转换为Java-8流的方式。

...实际上,有一种方法可以使用来自Spliterator的{​​{1}}通过一个语句来实现。绝对不是很好,但是:

Iterator