使用计数和限制时如何获取基础流的大小?

时间:2016-06-02 05:59:28

标签: java java-8

我有一个相当大的java.util.stream.Stream,我想提取这个流的一个子集,并获得整个源流的大小。我想保留流行为,所以我不想将此流收集到List。这可能吗?

df <- structure(list(Student = c("a", "b", "c", "a", "b", "a", "b", 
"c"), Month = c("Jan", "Jan", "Jan", "Feb", "Feb", "Mar", "Mar", 
"Mar"), Total = c(58L, 48L, 89L, 58L, 48L, 58L, 48L, 89L)),
.Names = c("Student", "Month", "Total"), class = "data.frame", 
row.names = c(NA, -8L))

2 个答案:

答案 0 :(得分:3)

Count是一个终端操作,意味着该流被认为是之后消耗的 - 所以不可能对它使用限制。我不认为这可以使用简单的流API,但您可以这样做:

final AtomicLong length = new AtomicLong(0);
Stream subsetStream = src.filter(a -> length.getAndIncrement() < y);
如果您确定src不是并行流,则

长度可以是常规长度。如果src是一个长度大于y的并行流,那么你可能得不到前y个元素而是y个元素。

答案 1 :(得分:-1)

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