当前位置: 首页 > 知识库问答 >
问题:

Java8中两个对象列表的合并

归俊杰
2023-03-14

我有一个Java类父类,它有20个属性(attrib1,attrib2..attrib20)及其相应的getter和setter。还有两个对象列表:list1list2

使用Java 8:

List<Parent> result = Stream.concat(list1.stream(), list2.stream())
                .distinct()
                .collect(Collectors.toList());   

但是我必须在哪个地方指定属性呢?是否应该重写hashcodeequals方法?

共有1个答案

穆鸿飞
2023-03-14

如果您想实现equalshashcode,那么可以在类parent中实现。在该类中添加如下方法

    @Override
    public int hashCode() {
        return Objects.hash(getAttrib1(), getAttrib2(), getAttrib3(),
            // …
                            getAttrib19(), getAttrib20());
    }

    @Override
    public boolean equals(Object obj) {
        if(this==obj) return true;
        if(!(obj instanceof Parent)) return false;
        Parent p=(Parent) obj;
        return Objects.equals(getAttrib1(), p.getAttrib1())
            && Objects.equals(getAttrib2(), p.getAttrib2())
            && Objects.equals(getAttrib3(), p.getAttrib3())
            // …
            && Objects.equals(getAttrib19(), p.getAttrib19())
            && Objects.equals(getAttrib20(), p.getAttrib20());
    }

如果这样做了,在调用distinct()将自动执行正确的操作。

如果您不想(或不能)更改类父类,则没有关于相等性的委托机制,但您可以使用排序,因为它具有委托机制:

Comparator<Parent> c=Comparator.comparing(Parent::getAttrib1)
        .thenComparing(Parent::getAttrib2)
        .thenComparing(Parent::getAttrib3)
        // …
        .thenComparing(Parent::getAttrib19)
        .thenComparing(Parent::getAttrib20);

这定义了一个基于属性的顺序。它要求属性的类型本身具有可比性。如果有这样的定义,则可以根据比较器,使用它实现distinct()的等效项:

List<Parent> result = Stream.concat(list1.stream(), list2.stream())
        .filter(new TreeSet<>(c)::add)
        .collect(Collectors.toList());

还有一个线程安全的变体,以防您希望将其与并行流一起使用:

List<Parent> result = Stream.concat(list1.stream(), list2.stream())
        .filter(new ConcurrentSkipListSet<>(c)::add)
        .collect(Collectors.toList());
 类似资料:
  • 问题内容: 我有一个带有20个属性的Java类及其相应的getter和setters。我也有两个对象列表:和。 现在,我想合并两个列表,并避免基于和的重复对象。 使用Java 8: 但是我必须在哪里指定属性?我应该重写和方法吗? 问题答案: 如果要实现and ,则 在 类 内部 进行操作。在该类中添加类似的方法 如果您这样做了,在上调用将自动执行正确的操作。 如果您不想(或无法)更改类,则没有平等

  • 我有一个包含多个字段和两个对象的列表,我的要求是形成一个

  • 问题内容: 我有以下Java6和Java8代码: Java8中有什么方法可以使用Lambda以更简洁的方式处理前一个问题? 问题答案: 流绑定到给定的可迭代/集合,因此您不能真正地“并行”迭代两个集合。 一种解决方法是创建索引流,但不一定比for循环有所改进。流版本可能如下所示:

  • 问题内容: 我想使用Java 8技巧在一行中执行以下操作。 给定此对象定义: 和a ,我想得到a ,它是第一个列表中所有s对象的列表- 顺序相同。 我可以使用Java中的循环来做到这一点,但我相信Java8中应该有一个单行lambda可以做到这一点。我无法在线找到解决方案。也许我没有使用正确的搜索词。 有人可以为这种转换建议一个lambda或另一种线吗? 问题答案: 这应该可以解决问题: 也就是说

  • 我可以在Java中使用循环来实现这一点,但我认为在Java8中应该有一个一行程序lambda来实现这一点。我无法在网上找到解决方案。也许我没有使用正确的搜索词。 有人能为这个转换提出一个lambda或另一个一行程序吗?

  • 为了简单起见,我试图组合两个不同对象的列表,我将它们称为和,最后根据它们的日期值对组合列表进行排序。我已经在这里看到了大部分的答案,但它们并没有展示如何正确实现这样的用例的全貌。 我还实现了一个自定义类,它处理两个给定列表的合并和排序。我们将其称为。使用下面实现的方法。 这就是问题所在,因为我在上得到一个错误,“reason:没有变量类型的实例存在,所以对象符合接口”