使用Java进行滑动窗口处理

动机

我想在Java中实现常用于时间序列处理的滑动窗口处理。在SQL中,大部分实现都有窗口函数,所以不需要担心,但是在Java中没有,因此我写下了这篇文章。

在StackOverflow上有代码,但是它要么使用List存储数据,要么使用库。

借用一下你的话,大致上是这样的感觉。

public static Stream<List> 滑动窗口(List 列表, int 大小) {
if(大小 > 列表.size())
return Stream.empty();
return IntStream.range(0, 列表.size()-大小+1)
.mapToObj(起始位置 -> 列表.subList(起始位置, 起始位置+大小));
}

这段代码我唯一不喜欢的地方就是参数是一个列表。这样会导致内存消耗增大的情况。

代码 (Mandarin:

我毫不费力地直接改写了它。

public static <T> void sliding(Stream<T> stream, int size, Consumer<List<T>> consumer) {
	Iterator<T> itr = stream.iterator();
	List<T> buffer = new LinkedList<T>();
	while (itr.hasNext()) {
		buffer.add(itr.next());
		if (buffer.size() > size)
			buffer.remove(0);
		consumer.accept(buffer);
	}
}

请确认动作

以下是对调用的一个例子的感觉。

sliding(Stream.of(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10), 3, System.out::println);

执行结果

以上的執行結果大致如下。

[0]
[0, 1]
[0, 1, 2]
[1, 2, 3]
[2, 3, 4]
[3, 4, 5]
[4, 5, 6]
[5, 6, 7]
[6, 7, 8]
[7, 8, 9]
[8, 9, 10]

请参考以下资源。
请参阅下列资料。
请参考下列参考资料。
请查看以下资源。
请参考下面的资料。

如何将Java流转换为滑动窗口?