Java 当使用count和limit时,如何获取底层流的大小?

Java 当使用count和limit时,如何获取底层流的大小?,java,java-8,Java,Java 8,我有一个相当大的java.util.stream.stream,我想提取这个流的一个子集,并获得整个源流的大小。我希望保留流行为,因此我不希望将此流收集到列表中。这可能吗 Stream src = .... Stream subsetStream = src.offset(x).limit(y); long totalLengthOfSrc = ?? 总的来说——是的,这是可能的。这取决于您使用的确切流。流只是一个接口,而对象始终是某个类的实例。例如,FileInputStream具有可通过g

我有一个相当大的java.util.stream.stream,我想提取这个流的一个子集,并获得整个源流的大小。我希望保留流行为,因此我不希望将此流收集到列表中。这可能吗

Stream src = ....
Stream subsetStream = src.offset(x).limit(y);
long totalLengthOfSrc = ??

总的来说——是的,这是可能的。这取决于您使用的确切流。流只是一个接口,而对象始终是某个类的实例。例如,FileInputStream具有可通过getChannel()方法访问的关联FileChannel,并具有size()方法。

计数是一个终端操作,这意味着该流被认为是在之后消耗的,因此不可能对其使用限制。我认为使用简单的流API不可能做到这一点,但您可以这样做:

final AtomicLong length = new AtomicLong(0);
Stream subsetStream = src.filter(a -> length.getAndIncrement() < y);
最终原子长度=新原子长度(0);
Stream subsetStream=src.filter(a->length.getAndIncrement()

如果您确定src不是并行流,那么length可以改为常规long。如果src是长度大于y的平行流,然后您可能不会得到第一个y元素,而是一些y元素。

FileInputStream
没有实现
Stream
。OP所说的
java.util.Stream.Stream
Interface.limit不是终端操作。
length
不能是常规的
long
,因为您不能修改lambda的局部变量表达式的周围范围。但是,无论您使用的是
AtomicLong
还是任何其他
long
容器,此解决方案都不能与有序流并行工作。@Holger是的,您需要某种长容器。