手动破解与两个列表相交的方法将是最快的方法。但是,如果您需要更通用的方法来处理其他事情Employee
,例如,您可以使用番石榴Equivalence
类。有了它,您可以将列表中的条目映射到一个Equivalence.Wrapper
并Sets.intersect
在这些包装器集上使用。
public static <T> Set<T> intersect(Iterable<? extends T> a, Iterable<? extends T> b, Equivalence<? super T> eq) {
Function<T, Wrapper<T>> f = wrappingFunction(eq);
Set<Wrapper<T>> as = ImmutableSet.copyOf(Iterables.transform(a, f));
Set<Wrapper<T>> bs = ImmutableSet.copyOf(Iterables.transform(b, f));
SetView<Wrapper<T>> intersection = Sets.intersection(as, bs);
return ImmutableSet.copyOf(Iterables.transform(intersection,
Test.<T> unwrappingFunction()));
}
哪里wrappingFunction()
有unwrappingFunction()
两个效用函数:
public static <T> Function<T, Wrapper<T>> wrappingFunction(
final Equivalence<? super T> eq) {
return new Function<T, Wrapper<T>>() {
public Wrapper<T> apply(T input) {
return eq.wrap(input);
}
};
}
private static final Function<Wrapper<Object>, Object> UNWRAPPING_FUNCTION = new Function<Wrapper<Object>, Object>() {
public Object apply(Wrapper<Object> input) {
return checkNotNull(input).get();
}
};
@SuppressWarnings("unchecked")
public static <T> Function<Wrapper<T>, T> unwrappingFunction() {
return ((Function<Wrapper<T>, T>) ((Function<?, ?>) UNWRAPPING_FUNCTION));
}
有了这个,你将不得不实施并Equivalence
申请Employee
intersect
Set<Employee> x = intersect(a, b, new Equivalence<Employee>() {
@Override
protected boolean doEquivalent(Employee a, Employee b) {
checkNotNull(a);
checkNotNull(b);
return Objects.equals(a.getId(), b.getId())
&& Objects.equals(a.getDepartment(), b.getDepartment())
&& Objects.equals(a.getName(), b.getName());
}
@Override
protected int doHash(Employee t) {
return t.getId();
}
});
在此示例中,返回的Set
将不包含重复Employees
。