2 つのリストが交差するようにメソッドを手動でハッキングするのが、最も速い方法です。しかし、より一般的なアプローチが必要な場合はEmployee
、たとえば guavasEquivalence
クラスを使用できます。これにより、リスト内のエントリを にマップし、それらのラッパー セットで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()));
}
wherewrappingFunction()
とunwrappingFunction()
are 2 つのユーティリティ関数があります。
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
れる には duplicate が含まれませんEmployees
。