标签:java java-8 java-stream n-gram
我认为这是一个关于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.
解决方法:
这样的操作不适合Stream API.在功能术语中,您尝试做的是一个大小为n的滑动窗口. Scala内置了sliding()方法,但Java Stream API中没有任何内置功能.
您必须依赖于在输入列表的索引上使用Stream来实现这一点.
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
List<List<Integer>> result = nGrams(list, 3);
System.out.println(result);
}
private static <T> List<List<T>> nGrams(List<T> list, int n) {
return IntStream.range(0, list.size() - n + 1)
.mapToObj(i -> new ArrayList<>(list.subList(i, i + n)))
.collect(Collectors.toList());
}
此代码只是在输入列表的索引上生成一个Stream,将它们中的每一个映射到一个新列表,该列表是从i到i n(排除)获取列表值的结果,并将所有这些值收集到List中.
标签:java,java-8,java-stream,n-gram 来源: https://codeday.me/bug/20190611/1220544.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。