首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java合并2个集合,同时根据特定字段比较和保留对象

Java合并2个集合,同时根据特定字段比较和保留对象
EN

Stack Overflow用户
提问于 2020-11-11 14:12:34
回答 1查看 80关注 0票数 0
代码语言:javascript
复制
class Object {
  string name;
  Time date;
  string createdBy;
  int version;
}

如何合并两组对象,并要求如果来自Set1的对象具有匹配的nameversion作为来自Set2的对象,则只将来自Set2的对象保留在合并后的集合中。

例如。

Set1:{ Object1(name:wilson, date:00:00:00, createdBy:admin, version:1), Object2(name:wilson, date:00:00:00, createdBy:admin, version:2) }

Set2:{ Object3(name:arizona, date:00:00:00, createdBy:user, version:5), Object4(name:wilson, date:00:00:00, createdBy:user, version:1) }

使用合并后的集合:{ Object4(name:wilson, date:00:00:00, createdBy:user, version:1), Object2(name:wilson, date:00:00:00, createdBy:admin, version:2), Object3(name:arizona, date:00:00:00, createdBy:user, version:5), } (顺序并不重要)

我可以将这两个集合合并,但我不确定如何利用Java 8 streams来添加此过滤条件

EN

回答 1

Stack Overflow用户

发布于 2020-11-11 15:31:41

如果您认为您的对象是相等的,如果名称和版本相同,那么您可以将其定义为您的相等性测试(即在您的类中覆盖equalshashcode )。

如果您已经将该条件定义为等于,那么将集合存储在一个集合中就很简单了:

代码语言:javascript
复制
Set<Object> mergedSet = new HashSet(set2);
mergedSet.addAll(set1);

请注意,我首先添加了set2,以便那里的对象具有优先权。

如果这是一种特殊情况,并且通常不能代表相等的对象,则:

代码语言:javascript
复制
Set<Object> mergedSet = new HashSet(set2);
set1.stream()
    .filter(o1 -> set2.stream()
        .noneMatch(o2 -> o1.name.equals(o2.name) && o1.version == o2.version))
    .forEach(mergedSet::add);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64781362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档