没有很好的方法将给定的boolean[] foo
数组转换为Java-8 中的一个语句,或者我错过了什么?
(我不会问为什么?,但实在是难以理解:为什么不为所有基本类型添加流支持?)
提示: Arrays.stream(foo)
不起作用,boolean[]
类型没有这种方法。
答案 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(即java-15模块)跳过,仍然没有使整型布尔数组与Stream一起工作的整洁方法 API在一起很好。自java-8起,API中没有处理原始布尔数组的新功能。
请注意,存在IntStream
,DoubleStream
和LongStream
,但与BooleanStream
一样,它都不表示原始布尔序列的变体。 Stream
的重载方法还有Stream::mapToInt
,Stream::mapToDouble
和Stream::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> this或this答案中所述的多条语句。
但是,您问(强调我的):
通过一个语句将给定的
boolean[]
foo数组转换为Java-8流的方式。
...实际上,有一种方法可以使用来自Spliterator
的{{1}}通过一个语句来实现。绝对不是很好,但是:
Iterator