使用自定义相等函数检查两个集合是否相同(忽略顺序)

Hen*_*rik 2 java equality guava

我有两个Foo系列.我无法改变Foo的实现,而Foo的equals函数实现不正确.我也不能继承Foo.我做自定义相等功能:我已经使用guava的Predicate函数实现了.为了给你一个想法,实现看起来有点像这样.

new Predicate<Pair<Foo, Foo>>() {
        @Override
        public boolean apply(@Nullable Pair<Foo, Foo> input) {
          Foo one = input.getFirst();
          Foo two = input.getSecond();
          return Objects.equals(one.getId(), two.getId());
        }
      };
Run Code Online (Sandbox Code Playgroud)

现在我需要检查我的两个Foo集合是否包含忽略订单的相同项目

我正在寻找使用此自定义相等功能执行此操作的最佳方法.

Sea*_*oyd 5

您可以将您的类包装在Guava中Equivalence并将其存储在Sets中.

Equivalence<Foo> eq = new Equivalence<Foo>{
// implement equals and hashcode
};
Set<Equivalence<Foo>> set1 = new HashSet<>();
set1.add(eq.wrap(someFoo));
Run Code Online (Sandbox Code Playgroud)

这样你就可以做双向containsAll()或做

Sets.difference(set1, set2).isEmpty()
Run Code Online (Sandbox Code Playgroud)