看这个问题:如何在 Java 8 中动态进行过滤?
问题是在执行过滤器后截断流。我不能使用限制,因为我不知道过滤器之后的列表有多长。那么,我们可以计算过滤后的元素吗?
所以,我想我可以创建一个类来计算并通过地图传递流。代码在这个答案中。
我创建了一个计数但保持元素不变的类,我在这里使用了一个函数,以避免使用我在另一个答案中使用的 lambda:
class DoNothingButCount<T > implements Function<T, T> {
AtomicInteger i;
public DoNothingButCount() {
i = new AtomicInteger(0);
}
public T apply(T p) {
i.incrementAndGet();
return p;
}
}
所以我的 Stream 终于:
persons.stream()
.filter(u -> u.size > 12)
.filter(u -> u.weitght > 12)
.map(counter)
.sorted((p1, p2) -> p1.age - p2.age)
.collect(Collectors.toList())
.stream()
.limit((int) (counter.i.intValue() * 0.5))
.sorted((p1, p2) -> p2.length - p1.length)
.limit((int) (counter.i.intValue() * 0.5 * 0.2)).forEach((p) -> System.out.println(p));
但我的问题是关于我的例子的另一部分。
collect(Collectors.toList()).stream().
如果我删除该行,结果是当我尝试执行限制时计数器为零。我通过使用可变对象以某种方式欺骗了“有效最终”的要求。
我可能错了,但我理解流是首先构建的,所以如果我们使用可变对象将参数传递给流中的任何步骤,这些将在创建流时采用。
我的问题是,如果我的假设是正确的,为什么需要这样做?流(如果非并行)可以按顺序通过所有步骤(过滤器、映射..),因此不需要此限制。