JAVA8把两个实体合并成一个_合并Java 8中的两个对象列表

小编典典

如果要实现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,则没有平等的委托机制,但是您可以求助于 排序, 因为它具有委托机制:

Comparator c=Comparator.comparing(Parent::getAttrib1)

.thenComparing(Parent::getAttrib2)

.thenComparing(Parent::getAttrib3)

// …

.thenComparing(Parent::getAttrib19)

.thenComparing(Parent::getAttrib20);

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

List result = Stream.concat(list1.stream(), list2.stream())

.filter(new TreeSet<>(c)::add)

.collect(Collectors.toList());

如果您想将其与并行流一起使用,则还有一个线程安全的变体:

List result = Stream.concat(list1.stream(), list2.stream())

.filter(new ConcurrentSkipListSet<>(c)::add)

.collect(Collectors.toList());

2020-11-13

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值