DTO
public class Result {
private List<Module> modules;
}
public class Module {
private String name;
private List<TestCase> testCases;
}
public class TestCase {
private String name;
private String result;
}
假设我有两个项目,
<!-- Result1 -->
<Result>
<Module name="a">
<TestCase name="tc1" result="pass"/>
<TestCase name="tc2" result="pass"/>
</Module>
<Module name="b">
<TestCase name="tc1" result="pass"/>
<TestCase name="tc2" result="pass"/>
<TestCase name="tc3" result="pass"/>
</Module>
</Result>
<!-- Result2 -->
<Result>
<Module name="a">
<TestCase name="tc1" result="pass"/>
</Module>
</Result>
我想得到两个集合Result1和Result2的交集
(例如result1.intersection(result2))
结果
<Result>
<Module name="a">
<TestCase name="tc2" result="pass"/>
</Module>
<Module name="b">
<TestCase name="tc1" result="pass"/>
<TestCase name="tc2" result="pass"/>
<TestCase name="tc3" result="pass"/>
</Module>
</Result>
我知道如何将这两个集合相交。但是,如果存在收藏集,我不知道如何相交。
如何使用Java 8流执行此操作?或其他方式?
您应该为您的Module类实现equals方法,然后可以使用与此类似的方法:
public Result intersection(Result r1, Result r2) {
Result result = new Result();
r1.getModules().forEach(module -> {
if (r2.getModules().contains(module)) {
result.getModules().add(module);
}
});
return result;
}
Java 8代码查找交集
Set<Result> result = list.stream()
.distinct()
.filter(otherList::contains)
.collect(Collectors.toSet());
由于Result
是一个自定义类,因此要使交叉口正常工作,您需要实现equals()
和hashcode()
。
https://www.baeldung.com/java-equals-hashcode-contracts
但是内部Module
将使用equals
和hascode
检查是否相等,如果未提供,则从Object类.....总的来说,为了满足您的要求,您需要在所有3个类别中都实现equals()
和hashcode()
,即Result
,Module
和TestCase
。