java – 优雅地组合两个列表的元素,使它们在某个属性值中是唯一的?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 优雅地组合两个列表的元素,使它们在某个属性值中是唯一的?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1829字,纯文字阅读大概需要3分钟。
内容图文
![java – 优雅地组合两个列表的元素,使它们在某个属性值中是唯一的?](/upload/InfoBanner/zyjiaocheng/754/1bdf62ac1a2e4bb88f234bcd97f02197.jpg)
假设我有这个Java 8代码:
public class Foo {
private long id;
public getId() {
return id;
}
//--snip--
}
//Somewhere else...
List<Foo> listA = getListA();
List<Foo> listB = getListB();
List<Foo> uniqueFoos = ???;
在List< Foo>中uniqueFoos我想添加listA和listB的所有元素,以便所有Foos都有唯一的ID.即如果在uniqueFoos中已经有一个具有特定ID的Foo,则不添加具有相同ID的另一个Foo,而是跳过它.
当然有简单的旧迭代,但我认为应该有更优雅的东西(可能涉及流,但不是强制性的),但我无法弄清楚…
我可以想到涉及重写equals()方法的好解决方案基本上返回id == other.id;并使用Set或distinct().不幸的是我无法覆盖equals(),因为对象相等性不能改变.
实现这一目标的清晰有效方法是什么?
解决方法:
您可以使用Collectors.toMap执行此操作:
Collection<Foo> uniqueFoos = Stream.concat(listA.stream(), listB.stream())
.collect(Collectors.toMap(
Foo::getId,
f -> f,
(oldFoo, newFoo) -> oldFoo))
.values();
如果您需要List而不是Collection,只需执行以下操作:
List<Foo> listUniqueFoos = new ArrayList<>(uniqueFoos);
如果还需要保留元素的遭遇顺序,则可以使用为接收到的映射接受供应商的重载版本Collectors.toMap:
Collection<Foo> uniqueFoos = Stream.concat(listA.stream(), listB.stream())
.collect(Collectors.toMap(
Foo::getId,
f -> f,
(oldFoo, newFoo) -> oldFoo,
LinkedHashMap::new))
.values();
我认为值得添加一个非流变体:
Map<Long, Foo> map = new LinkedHashMap<>();
listA.forEach(f -> map.merge(g.getId(), f, (oldFoo, newFoo) -> oldFoo));
listB.forEach(f -> map.merge(g.getId(), f, (oldFoo, newFoo) -> oldFoo));
Collection<Foo> uniqueFoos = map.values();
这可以重构为通用方法,不重复代码:
static <T, K> Collection<T> uniqueBy(Function<T, K> groupBy, List<T>... lists) {
Map<K, T> map = new LinkedHashMap<>();
for (List<T> l : lists) {
l.forEach(e -> map.merge(groupBy.apply(e), e, (o, n) -> o));
}
return map.values();
}
你可以使用如下:
Collection<Foo> uniqueFoos = uniqueBy(Foo::getId, listA, listB);
该方法使用Map.merge方法.
内容总结
以上是互联网集市为您收集整理的java – 优雅地组合两个列表的元素,使它们在某个属性值中是唯一的?全部内容,希望文章能够帮你解决java – 优雅地组合两个列表的元素,使它们在某个属性值中是唯一的?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。