调试代码遗留
您可能需要对重复项列表进行重复数据删除...来自旧版代码。 该类-我们称其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}
或者,存在可以完成任务的第三方库。
调试代码遗留