编程语言
首页 > 编程语言> > java – Guava Sets.difference#isEmpty()行为

java – Guava Sets.difference#isEmpty()行为

作者:互联网

我不理解Guava的集合的行为#isremp()方法的区别:

  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)为真.

即使javadoc说,我也不明白逻辑:

{@code set2} may also contain elements not present in {@code set1}; these are simply ignored

我错了吗?我要填一个问题吗?

(我正在使用guava-18.0)

解决方法:

从guava文档“public static Sets.SetView difference(Set set1,Set set2)”:

The returned set contains all elements that are contained by set1 and not contained by set2

如您所见,您的set1都不符合这些条件,因此差异集为空.

请注意,差异方法对于参数不是可交换的,并且差异集不是(C,D,E),因为当您调用差异时(set1,set2);

标签:java,set,guava,is-empty
来源: https://codeday.me/bug/20190528/1168124.html