我正在制作一个程序,将图片转换为灰度形式,然后从该灰度形式将其转换为精灵格式。
我正在使用嵌套的for循环来转换嵌套列表。这可以完美地工作,但是我想使用流来完成它,如果我使用输出来改变它,但是我认为它应该产生相同的输出。我在哪里错了?
grayPhoto是List<List<Graypixel>>
你们中有人看到我做错了还是应该如何处理?
for (int i = 0; i < grayPhoto.size(); i++) {
for (int j = 0; j < grayPhoto.get(i).size(); j++) {
numbersSet.add(grayPhoto.get(i).get(j));
}
}
grayPhoto.forEach(r -> r.forEach(e -> numbersSet.add(e)));
答案 0 :(得分:3)
您需要使用flatMap
操作,将列表列表展平为列表(此处是列表流到此处的流),然后以Set
的形式收集:
Set<Graypixel> numbersSet = grayPhoto.stream()
.flatMap(List::stream)
.collect(Collectors.toSet());
答案 1 :(得分:2)
我认为它应该导致相同的输出。我在哪里错了?
您没看错。两种转换方式的结果都相同。我假设numbersSet
是Set<Graypixel>
,例如HashSet
。
即使是List<Graypixel>
,两种情况下的结果列表也相同。当然,如果您同时运行两个代码段,则所有像素都会被添加两次到列表中。
有关规范的转换方式,请参见JB Nizet的评论或azro的答案。