我有两个对象集合。这两个集合中的对象是不同类型的,并且有一个自定义匹配器来检查它们是否引用相同的东西。此外,集合的顺序相同。比方说,我们可以按名称比较这些集合中的实体,它们按该名称排序,我们有一个自定义匹配器,如果名称相同,则返回true。
我需要的是一个匹配器,它将逐项迭代这两个集合,并使用现有的自定义匹配器比较这些对(我也可以修改它)。
有人知道怎么做吗?
我的意思是:
List lA =....;
List lB =....;//我所拥有的:
(int i=0; i
//我想有断言(lA,一些MagicMatcher(myModifiedCustomMatcher(lB));
让我们来考虑一下这个测试:
@Test
public void test() throws Exception {
List<MyType1> expected = ...;
List<MyType2> actual = ...;
assertThat(actual, containsUsingCustomMatcher(expected));
}
您可以使用以下帮助函数(matchesUSingMyCustomMatcher
与示例中的函数相同)。
private Matcher<Iterable<? extends MyType2>> containsUsingCustomMatcher(List<MyType1> items) {
List<Matcher<? super MyType2>> matchers = new ArrayList<Matcher<? super MyType2>>();
for (MyType1 item : items) {
matchers.add(matchesUsingMyCustomMatcher(item));
}
return Matchers.contains(matchers);
}
对于更可重用的方法,以下内容可能会对您有所帮助。首先,我们需要一个通用的helper函数。
public static <T, R> Matcher<Iterable<? extends R>> containsUsingCustomMatcher(List<T> items, MatcherFunction<T, R> matcherFunction) {
return Matchers.contains(createMatchers(items, matcherFunction));
}
private static <R, T> List<Matcher<? super R>> createMatchers(List<T> items, MatcherFunction<T, R> matcherFunction) {
List<Matcher<? super R>> matchers = new ArrayList<Matcher<? super R>>();
for (T item : items) {
matchers.add(matcherFunction.apply(item));
}
return matchers;
}
还有一个接口MatcherFunction
。此接口的实现必须创建适当的匹配器
public interface MatcherFunction<T, R> {
Matcher<R> apply(T t);
}
与本答案第一部分相同的示例用法:
assertThat(actual, containsUsingCustomMatcher(expected, myCustomMatcherFunction()));
具有
private MatcherFunction<MyType1, MyType2> myCustomMatcherFunction() {
return new MatcherFunction<MyType1, MyType2>() {
@Override
public Matcher<MyType2> apply(MyType1 t) {
return matchesUsingMyCustomMatcher(t);
}
};
}
Java8注:
这些匿名课程看起来有点丑。有了Java8,你可以简单地写
assertThat(actual, containsUsingCustomMatcher(expected, this::matchesUsingMyCustomMatcher));
嗨,我有两个自定义数组列表,我想从一个数组列表中删除与第二个数组列表匹配的类似项。
我也可以使用相同的比较器按Id对列表进行排序吗?
我有两个对象类Person和Employee。两个类都有共同的属性年龄。我已经在Arraylist中添加了这两个类的几个对象,现在我需要两个,写一个比较器,并将其传递给集合类的sort方法。并希望列表按年龄排序。我尝试这样做只是为了更清楚地使用Java中的carparable和Comparator。 编辑:我问这个问题的原因是我不清楚比较者和可比性。我在某个地方读到,如果类实现了可比较的,那么它就
问题内容: 我需要编写一个比较器,它采用类型A的对象A和类型B的对象B。这两个对象不是公共对象的扩展。它们的确不同,但是我需要通过其中的通用字段来比较这两个对象。我必须使用比较器接口,因为对象存储在Set中,并且在必须对CollectionUtils执行操作之后。我在Google上搜索了一下,发现了Comparator的解决方案,但只有相同的类型。 我试图朝这个方向实施思考,但是我不知道我是否在正
我需要写一个比较器,取一个a类型的对象a和一个B类型的对象B。这两个对象不是一个公共对象的扩展。他们确实是不同的,但我需要比较这两个对象在它的共同领域。我必须使用比较器接口,因为对象存储在Set中,之后我必须使用CollectionUtils进行操作。我搜索了一点点,我用比较器找到了解决方案,但只有相同的类型。 TXS 附注:我在不同的集合中添加两个对象: 之后我会这样想: