Stream API提供distinct()方法,该方法基于数据Object类的equals()方法返回列表的不同元素。下面先做一个数据Object类,用来发现重复数据:
public class LegacyObject {
private final UUID id;
private final String foo;
private final int bar;
public LegacyObject(UUID id, String foo, int bar) {
this.id = id;
this.foo = foo;
this.bar = bar;
}
@Override
public int hashCode() {
return Objects.hash(id);
}
// Implementation of equals() using only the id field
// Getters
}
public class DeduplicateWrapper {
private final LegacyObject object;
public DeduplicateWrapper(LegacyObject object) {
this.object = object;
}
public LegacyObject getObject() {
return object;
}
@Override
public int hashCode() {
return Objects.hash(object.getFoo());
}
// Implementation of equals() using only the foo field of the wrapped object
}
使用流API重复删除集合:
List duplicates = ...;
duplicates.stream()
.map(DeduplicateWrapper::new)
.distinct()
.map(DeduplicateWrapper::getObject);
不使用Stream的Java8之前代码
List deduplicated = new ArrayList<>();
Set wrappers = new HashSet<>();
for (LegacyObject duplicate: duplicates) {
wrappers.add(new DeduplicateWrapper(duplicate));
}
for (DeduplicateWrapper wrapper: wrappers) {
deduplicated.add(wrapper.getObject());
}
如果你足够幸运能够使用Kotlin:
val duplicates: List = ...
duplicates.distinctBy { it.foo }