java – 如果对象上的属性相同,则压缩对象列表
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 如果对象上的属性相同,则压缩对象列表,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1614字,纯文字阅读大概需要3分钟。
内容图文
![java – 如果对象上的属性相同,则压缩对象列表](/upload/InfoBanner/zyjiaocheng/728/8d27542e573e4eee806d0952120f7fc6.jpg)
我有一个对象列表,如下所示:
public class MyObject {
String id;
List<String> list;
MyObject(String id, List<String> list) {
this.id = id;
this.list = list;
}
String getId() {
return id;
}
List<String> getList() {
return list;
}
}
我想压缩列表,以便如果两个MyObject具有相同的id,它们将合并为一个.
我能想到的最好的解决方案是覆盖MyObject中的equals方法,这样如果它们的id相同,则2个对象是相同的,并执行如下操作:
List<MyObject> condense(List<MyObject> fullList) {
List<MyObject> condensedList = new ArrayList<>();
for (MyObject obj : fullList) {
if (condensedList.contains(obj)) {
MyObject obj2 = condensed.get(condensed.indexOf(obj));
obj = merge(obj, obj2);
}
condensedList.add(obj);
}
return condensedList;
}
MyObject merge(MyObject obj1, MyObject obj2) {
List<String> merged = new ArrayList<>();
merged.addAll(obj1.getList());
merged.addAll(obj2.getList());
return new MyObject(obj1.getId(), merged);
}
这不是一个很好的解决方案,因为如果它们的ID是相同的那些对象并不是真的相等,它们只需要在这种特殊情况下组合.而且它不是很简洁.
有没有更好的办法?
解决方法:
你确实可以使这更简洁.
List<MyObject> condense(List<MyObject> fullList) {
Map<String, MyObject> tempMap = new HashMap<>();
fullList.forEach(a -> tempMap.merge(a.getId(), a, MyObject::merge));
return new ArrayList<>(tempMap.values());
}
这使用Map::merge来执行工作. Map::merge基本上表示如果指定的键a.getId()尚未与值关联或与null关联,则将其与给定的非空值相关联.
否则,将相关值替换为给定重映射函数MyObject :: merge的结果,或者如果结果为null则删除.
完成后,我们收集映射值并将其返回到ArrayList实例中.
注意上面的MyObject :: merge函数假定merge在MyObject类中定义为公共静态MyObject merge(MyObject obj1,MyObject obj2){…}.
内容总结
以上是互联网集市为您收集整理的java – 如果对象上的属性相同,则压缩对象列表全部内容,希望文章能够帮你解决java – 如果对象上的属性相同,则压缩对象列表所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。