我认为这是一个关于Java 8流的一个相当基本的问题,但我很难想到正确的搜索术语 . 所以我在这里问 . 我刚刚进入Java 8,所以请耐心等待 .
我想知道如何将标记流映射到n-gram流(表示为大小为n的标记数组) . 假设n = 3,那么我想转换下面的流
{1, 2, 3, 4, 5, 6, 7}
至
{[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7]}
如何使用Java 8流实现此目的?应该可以同时计算这个,这就是为什么我有兴趣用流来实现这个目标(处理n阵列的顺序也无关紧要) .
当然,我可以使用老式for循环轻松完成,但我更喜欢使用流API .
2 回答
这样的操作不适合Stream API . 在功能术语中,您要做的事情被称为大小为
n
的滑动窗口 . Scala内置了sliding()
方法,但Java Stream API中没有任何内置功能 .您必须依赖于在输入列表的索引上使用Stream来实现这一点 .
此代码只是在输入列表的索引上生成一个Stream,将它们中的每一个映射到一个新列表,该列表是从
i
到i+n
(排除)获取列表值的结果,并将所有这些值收集到List中 .如果您没有随机访问源数据,则可以使用自定义收集器完成此操作:
这是
window
的来源 . 它是平行友好的: