调试代码遗留_遗留代码中的重复数据删除技巧

调试代码遗留

您可能需要对重复项列表进行重复数据删除...来自旧版代码。 该类-我们称其LegacyObject已经具有equals()hashCode() 。 由于担心破坏正在运行的代码,因此无法更改实现。 不幸的是,Java API没有提供distinctBy()功能。

在这种情况下,一个便宜的技巧是用所需的实现围绕LegacyObject创建一个包装器类:

publicclassLegacyObject{

  privatefinalUUIDid;
  privatefinalStringfoo;
  privatefinalintbar;

  publicLegacyObject(UUIDid,Stringfoo,intbar){
    this.id=id;
    this.foo=foo;
    this.bar=bar;
  }

  @Override
  publicinthashCode(){
    returnObjects.hash(id);
  }

  // Implementation of equals() using only the id field
  // Getters
}

publicclassDeduplicateWrapper{

  privatefinalLegacyObjectobject;

  publicDeduplicateWrapper(LegacyObjectobject){
    this.object=object;
  }

  publicLegacyObjectgetObject(){
    returnobject;
  }

  @Override
  publicinthashCode(){
    returnObjects.hash(object.getFoo());
  }

  // Implementation of equals() using only the foo field of the wrapped object
}

这样一来,使用流API对集合进行重复数据删除就很容易了:

List<LegacyObject>duplicates=...;

duplicates.stream()
    .map(DeduplicateWrapper::new)
    .distinct()
    .map(DeduplicateWrapper::getObject);

它也可以使用Java 8之前的代码工作,但涉及更多的仪式:

List<LegacyObject>deduplicated=newArrayList<>();
Set<DeduplicateWrapper>wrappers=newHashSet<>();
for(LegacyObjectduplicate:duplicates){
  wrappers.add(newDeduplicateWrapper(duplicate));
}
for(DeduplicateWrapperwrapper:wrappers){
  deduplicated.add(wrapper.getObject());
}

当然,如果您很幸运能够使用Kotlin,这将变得不费吹灰之力:

valduplicates:List<LegacyObject>=...
duplicates.distinctBy{it.foo}

或者,存在可以完成任务的第三方库。

更进一步:

翻译自: https://blog.frankel.ch/deduplication-trick/

调试代码遗留

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值