有没有漂亮的方式可以在Java-8中将给定的
提示:
boolean[] foo
数组转换为流呢?或者我可能遗漏了什么?提示:
Arrays.stream(foo)
不能用于boolean[]
类型。boolean[] foo
数组转换为流呢?或者我可能遗漏了什么?Arrays.stream(foo)
不能用于boolean[]
类型。给定boolean[] foo
使用
Stream<Boolean> stream = IntStream.range(0, foo.length)
.mapToObj(idx -> foo[idx]);
请注意,每个布尔值都将被装箱,但通常这不是一个大问题,因为对于布尔型的装箱不会分配额外的内存(只使用预定义值之一-Boolean.TRUE
或Boolean.FALSE
)。
IntStream.mapToBoolean
、BooleanStream.mapToDouble
等时,API 的增长呈二次函数趋势。所以他们必须在某个地方停下来。他们认为 int
、long
和 double
是最常用的原始类型,因此这是一个合理的折衷。希望 Java 10 能够为我们带来泛型专门化,使得 Stream<boolean>
可以直接使用。 - Tagir ValeevBooleans
类。Stream<Boolean> stream = Booleans.asList(foo).stream();
这是一种相当高效的方式,因为Booleans.asList
返回数组的包装器而不制作任何副本。
toArray()
)的性能。此外,它不会很好地并行化(如果有人关心的话)。 - Tagir ValeevList
的默认分割器(spliterator
)“报告 Spliterator.SIZED
和 Spliterator.ORDERED
”。 - HolgerBooleans.asList()
返回的Spliterator的特性,看起来它具有SIZED特性。 - ZhekaKozlovtrySplit()
方法必须被正确实现。默认情况下是“穷人并行”,它通过迭代器顺序遍历列表到中间缓冲区。 - Tagir ValeevStream.Builder<Boolean> builder = Stream.builder();
for (int i = 0; i < foo.length; i++)
builder.add(foo[i]);
Stream<Boolean> stream = builder.build();
…or by wrapping an AbstractList
around foo
Stream<Boolean> stream = new AbstractList<Boolean>() {
public Boolean get(int index) {return (foo[index]);}
public int size() {return foo.length;}
}.stream();
for
循环内的三个语句表达式。 - Andrey Tyukin浏览最新的java-15早期访问JavaDoc(即java.base
模块),仍然没有很好的方法使原始布尔数组与Stream API良好地协作。自java-8以来,API中没有处理原始布尔数组的新功能。
IntStream
、DoubleStream
和LongStream
,但没有像BooleanStream
这样的东西,它表示原始布尔序列的变化。此外,Stream
的重载方法是Stream::mapToInt
、Stream::mapToDouble
和Stream::mapToLong
,但不是返回假设的BooleanStream
的Stream::mapToBoolean
。Collectors
中也可以找到。对于float
原语类型没有这样的支持(相反,有double
原语类型的支持)。在我看来,与float
不同,实现boolean
支持是有意义的。Boolean[] array
),事情会变得更容易:Boolean[] array = ...
Stream<Boolean> streamOfBoxedBoolean1 = Arrays.stream(array);
Stream<Boolean> streamOfBoxedBoolean2 = Stream.of(array);
boolean[]
foo数组转换为Java-8中的流的方法是一个语句。Iterator
制作的Spliterator
来实现一个语句。 这绝对不好看,但是:boolean[] array = ...
Stream<Boolean> stream = StreamSupport.stream(
Spliterators.spliteratorUnknownSize(
new Iterator<>() {
int index = 0;
@Override public boolean hasNext() { return index < array.length; }
@Override public Boolean next() { return array[index++]; }
}, 0), false);
int
、long
和double
提供了专用的原始流,并且Arrays.stream
不接受boolean[]
。我想你需要将其装箱。 - MenaBitSet
而不是使用数组会有好处吗? - JonKboolean[]
数组转换为BitSet
。 - Holger(Object|int|long|double|void) -> (Object|int|long|double|void|boolean)
函数矩阵:这 30 个函数实际上都存在于 JDK 中,似乎没有提供其他的一元/零元函数。因此,BooleanSupplier
看起来是合理的选择。 - Tagir Valeev