【发布时间】:2015-12-31 17:27:35
【问题描述】:
我不明白 Guava 的 Sets#difference 关于 isEmpty() 方法的行为:
public static <E> SetView<E> difference(final Set<E> set1, final Set<?> set2) {
checkNotNull(set1, "set1");
checkNotNull(set2, "set2");
final Predicate<Object> notInSet2 = Predicates.not(Predicates.in(set2));
return new SetView<E>() {
@Override public Iterator<E> iterator() {
return Iterators.filter(set1.iterator(), notInSet2);
}
@Override public int size() {
return Iterators.size(iterator());
}
@Override public boolean isEmpty() {
return set2.containsAll(set1);
}
@Override public boolean contains(Object element) {
return set1.contains(element) && !set2.contains(element);
}
};
}
更准确地说,我不明白 set2.containsAll(set1); 如何用作 isEmpty() 的结果。
举个例子:
- set1 = A,B
- set2 = A,B,C,D,E
差值 (C,D,E) 绝对不会为空。 但是 Sets.difference(set1, set2).isEmpty() 将返回 true,因为 (A,B,C,D,E).containsAll(A,B) 为 true。
即使 javadoc 这么说,我也不明白其中的逻辑:
{@code set2} 也可能包含 {@code set1} 中不存在的元素;这些都被忽略了
我错了吗?我要填一个问题吗?
(我使用的是 guava-18.0)
【问题讨论】: