【问题标题】:Convert nested list List<List<Object>> into Set<Object> [duplicate]将嵌套列表 List<List<Object>> 转换为 Set<Object> [重复]
【发布时间】:2019-12-07 14:43:02
【问题描述】:

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

我正在使用嵌套的 for 循环来转换嵌套列表。这工作得很好,但我想使用流来做到这一点,如果我使用输出改变来做到这一点,但我认为它应该产生相同的输出。我哪里错了?

grayPhoto 是List&lt;List&lt;Graypixel&gt;&gt;

你们有没有看到我做错了什么或者流应该是怎样的?

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)));

【问题讨论】:

  • 惯用的方法是使用 flatMap 并使用 Collectors.toSet() 收集到一个集合。 docs.oracle.com/javase/8/docs/api/java/util/stream/…你问的是错误吗?
  • 什么是numbersSet? (我的意思是为什么相同数据类型的名称会有如此大的差异。)除此之外,它是List 还是Set?
  • 您现在可以考虑接受一个答案;)以奖励那些为您花费时间的人;)或评论一个答案以获取详细信息

标签: java list lambda set java-stream


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我认为它应该产生相同的输出。我哪里错了?

    你没有错。您的两种转换方式都会产生相同的结果。我假设numbersSet 是Set&lt;Graypixel&gt;,例如HashSet。

    即使是List&lt;Graypixel&gt;,两种情况下的结果也是相同的列表。当然,如果你运行 both sn-ps,所有的像素都会被添加两次到列表中。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-12
      • 1970-01-01
      • 2020-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多