当前位置: 首页 > 面试题库 >

合并Java 8中的两个对象列表

太叔京
2023-03-14
问题内容

我有一个Parent带有20个属性的Java类(attrib1, attrib2 .. attrib20)及其相应的getter和setters。我也有两个Parent对象列表:list1list2

现在,我想合并两个列表,并避免基于attrib1和的重复对象attrib2

使用Java 8:

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

但是我必须在哪里指定属性?我应该重写hashCodeequals方法吗?


问题答案:

如果要实现equalsand hashCode,则 内部 进行操作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()在上调用Stream<Parent>将自动执行正确的操作。

如果您不想(或无法)更改类Parent,则没有平等的委托机制,但是您可以求助于 排序, 因为它具有委托机制

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

这将基于属性定义顺序。它要求属性本身的类型是可比较的。如果你有这样的定义,你可以用它来实现的等效distinct(),基于这样Comparator

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


 类似资料:
  • 我有一个Java类,它有20个属性及其相应的getter和setter。还有两个对象列表:和。 使用Java 8: 但是我必须在哪个地方指定属性呢?是否应该重写和方法?

  • 问题内容: 我有以下输入-2个json文件,一个是基础文件,第二个包含相同的属性,但值不同,我想合并这些对象。 例如: 第二个文件: 结果应该是这样的: 使用powershell可以做到吗? 问题答案: (请参见下面的更新) 结果: 您可能会考虑不覆盖左值: 在这种情况下,结果将是: 更新2019年11月16日 的参数已经被耗尽,分过和参数(遗憾的重大更改)。好消息是,对象合并的默认参数设置包含在

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

  • 问题内容: 我有两个从JSON转换的数据对象。两者都非常复杂,我想以类似于jQuery使用扩展合并两个对象的方式来合并它们。 例 JSON 1: JSON 2: 合并成 用PHP对象解决此问题的最佳方法是什么。 问题答案: 将每个JSON字符串解码为一个关联数组,合并结果并重新编码 更新: 如果您有特定的合并要求,则需要编写自己的合并功能。我在下面写了一篇满足您问题中要求的书。如果您有其他未提及的

  • 问题内容: 我试图在我的类中有一个默认对象,它具有可接受的默认属性,并让开发人员通过指定另一个对象来覆盖其中的一些默认属性,但是我找不到一种很好的方法来做到这一点。 预期的用法如下: 问题答案: 实现该接口,因此您 可以 按原样对待它,并使用诸如添加another的内容之类的方法。 但是,如果您将其视为地图,则需要非常小心: 因为它 看起来 像一个复制构造函数,但事实并非如此,这常常使人们感到 困

  • rank ▲ ✰ vote url 65 357 50 683 url 合并两个列表 怎样合并两个列表? 例如: listone = [1,2,3] listtwo = [4,5,6] 我期待: mergedlist == [1, 2, 3, 4, 5, 6] 在Python中非常容易. mergedlist = listone + listtwo