简单地说,滑窗算法是一种移动固定大小的窗口(子列表)来遍历数据结构的方法,主要是基于固定步骤的序列流数据。
如果我们想通过使用大小为3的窗口遍历列表[1 2 3 4 5],我们透过窗口只能看到以下数据组:
[1 2 3]
[2 3 4]
[3 4 5]
.如果我们想要使用比集合大小更大的窗口遍历相同的列表,我们甚至不会得到一个元素。
Java 10提供了一种Stream实现,支持顺序和并行聚合操作的一系列元素:
int sum = widgets.stream()
.filter(w -> w.getColor() == RED)
.mapToInt(w -> w.getWeight())
.sum();
下面谈的是如何在这个流上使用滑窗算法。
为了能够创建自定义Stream,我们需要实现自定义Spliterator。
在我们的例子中,我们需要能够迭代Stream 序列数据,因此我们需要实现Spliterator接口并指定泛型类型参数:
public class SlidingWindowSpliterator implements Spliterator> {
// ...}
有一堆方法需要实现:
public class SlidingWindowSpliterator implements Spliterator> {
//下面会实现@Override
public boolean tryAdvance(Consumer super Stream> action) {
<