我想比较一个列表是否是另一个列表的子列表
假设我有以下列表
List<String> checkList = Arrays.asList("a", "d");
List<String> actualList = Arrays.asList("a", "b", "c", "d");
我想检查 actualList
是否包含 checkList
。我可以迭代每个值并进行比较。但是有没有 hamcrest matcher 可以完成这项工作
例如。
a
,d
应该通过
a
、b
、c
应该通过
但是a
,e
应该失败
hasItems
支持单独传递字符串,contains
检查所有值,in
支持存在一个项目在一个列表中。但我想要
assertThat(actualList,containsList(checkList))
是否有可用的内置匹配器或者我需要编写自定义匹配器?
最佳答案
hasItems
接受 varargs 参数,因此您只需将列表转换为数组并传递它(或者,只需将其声明为数组即可):
final List<String> checkList = Arrays.asList("a", "d");
// final String[] checkListAsArray = new String[] { "a", "d" };
final String[] checkListAsArray = checkList.toArray(new String[checkList.size()]);
final List<String> actualList = Arrays.asList("a", "b", "c", "d");
assertThat(actualList, Matchers.hasItems(checkListAsArray));
检查列表的顺序并不重要。
如果交换 checkList
和 actualList
的角色,您还可以编写:
assertThat(checkList, everyItem(isIn(actualList)));
这可能比以下内容更具可读性:
assertTrue(actualList.stream().allMatch(checkList::contains));
关于Java Hamcrest Matcher 检查列表是否包含另一个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58592066/