将嵌套列表List <List <Object >>转换为Set <Object>

时间:2019-12-07 14:43:02

标签: java list lambda set java-stream

我正在制作一个程序,将图片转换为灰度形式,然后从该灰度形式将其转换为精灵格式。

我正在使用嵌套的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)));

2 个答案:

答案 0 :(得分:3)

您需要使用flatMap操作,将列表列表展平为列表(此处是列表流到此处的流),然后以Set的形式收集:

Set<Graypixel> numbersSet = grayPhoto.stream()
                                     .flatMap(List::stream)
                                     .collect(Collectors.toSet());

答案 1 :(得分:2)

  

我认为它应该导致相同的输出。我在哪里错了?

您没看错。两种转换方式的结果都相同。我假设numbersSetSet<Graypixel>,例如HashSet

即使是List<Graypixel>,两种情况下的结果列表也相同。当然,如果您同时运行两个代码段,则所有像素都会被添加两次到列表中。

有关规范的转换方式,请参见JB Nizet的评论或azro的答案。