【问题标题】:JAVA 8 : HOW TO MERGE TWO LIST USING 2 STREAM [closed]JAVA 8:如何使用 2 STREAM 合并两个列表 [关闭]
【发布时间】:2020-04-08 22:26:44
【问题描述】:

你好,我写了以下代码

for (Object1 o1 : listObject1) {
  boolean found = false;
  for (Object2 o2 : listObject2) {
    found = o2.getKey().equals(o1.getKey());
    if (found) break;
  }
  if (!found) listObject2.add(new Object2(o1.getKey()));
}

但我想使用流在 Java 8 中编写它。我尝试使用 flatMap 但没有成功。有人能帮我吗 ?并向我解释一下 flatmap 的用途?

谢谢

【问题讨论】:

  • 提示:将您的整个标题插入 Google 搜索,您将有大量阅读示例。
  • 你正在调用listObject2.add,它被称为变异列表。因为 Java 中的流试图模仿本质上不可变的函数式编程,所以我认为在这种情况下使用它不是一个好主意,因为流的输出会创建一个新列表。
  • @PM77-1 通常是非常好的建议,但在这种情况下,标题可能并未描述 OP 真正想要实现的目标(至少基于代码示例)。
  • @PM77-1 在发布这篇文章之前我搜索了但我没有找到我的案例的例子
  • 按照我的阅读方式,OP 想要连接两个流,然后去重复。

标签: java list java-stream


【解决方案1】:

如果您的目标是提高可读性,那么 IMO 最大的收获不是通过流,而是通过缓存第二个列表中元素的键(如果您愿意,可以通过流来完成)

Set<String> keysInList2 = listObject2.stream()
                                     .map(Object2::getKey)
                                     .collect(Collectors.toSet());

如果您可以add 从listObject1 中设置另一个对象的键,那么这意味着该键还没有出现在集合中。在这种情况下,您还应该将带有此类键的新 Object2 元素添加到 listObject2

for (Object1 o1 : listObject1) {
    if (keysInList2.add(o1.getKey())){
        listObject2.add(new Object2(o1.getKey()));
    }
}

【讨论】:

    猜你喜欢
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-24
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    相关资源
    最近更新 更多