【问题标题】:JAVA : How to remove duplicates from list using stream [duplicate]JAVA:如何使用流从列表中删除重复项[重复]
【发布时间】:2023-03-03 15:06:02
【问题描述】:

我想根据列表中项目的属性(邮件)从列表中删除重复项。
我这样做了:

acteurs = acteurs.stream().distinct().collect(Collectors.toList());

Acteur的equals方法

@Override
public boolean equals(Object o) {
    if (this.getMail().equals(((Acteur)o).getMail())) {
        return true;
    }
    if (this == o) {
        return true;
    }
    if (o == null || getClass() != o.getClass()) {
        return false;
    }
    Acteur acteur = (Acteur) o;
    if(acteur.id == null || id == null) {
        return false;
    }
    return Objects.equals(id, acteur.id);
}

在指令期间应该调用equals方法

acteurs = acteurs.stream().distinct().collect(Collectors.toList());

但事实并非如此。
我哪里错了?

更新:
我的解决方案:

List<Acteur> dto3s =acteurs.stream()
            .collect(Collectors.collectingAndThen(
                Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Acteur:: getMail))),
                ArrayList::new));

【问题讨论】:

  • equals 方法无法编译。向我们展示真实的。
  • 那么删除重复的acteur(具有相同'mail'值)的最佳方法应该是什么?
  • 另外,您的equals 方法可以轻松抛出ClassCastException
  • @thomas 你是否覆盖了hashCode()

标签: java list java-stream


【解决方案1】:

你违反了equals/hashCode 合约。

需要根据需求实现hashCode

【讨论】:

  • 他没有使用 Hasmap
  • 那么hascode会出现在List中吗? @talex
  • 从这段代码你看不出来。
  • @AdityaRewari HashMapdistinct 方法的幕后使用。
  • @AdityaRewari 没有一个。 Stream#distinct() 操作目前是使用基于哈希的、强制唯一的集合实现的。
【解决方案2】:

您可以使用以下解决方案,通过不同的键 mail 创建地图并获取地图的值

acteurs.stream().collect(Collectors.toMap(a -> a.getMail(), Function.identity(), (a1, a2) -> a1)).values();

第三个参数(a1, a2) -&gt; a1 意味着每当它发生冲突时,即需要向映射添加一个具有相同键的条目(key,value),它将使用映射的当前值,即无操作

请记住,这只会通过mail属性进行比较,如果您想使用映射逻辑通过更复杂的方式进行比较,您可能需要正确实现hash()equals()

【讨论】:

    【解决方案3】:

    您的 equals 方法似乎不正确,因为如果“if 条件”不满足,您需要“返回 false”

    【讨论】:

    • OP 已更新问题。这个答案不再相关。
    猜你喜欢
    • 2020-04-22
    • 2023-03-05
    • 1970-01-01
    • 2019-12-07
    • 2014-09-30
    • 2011-10-09
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多