如果两个列表基于某个属性具有相同的元素,则进行比较



假设我有两个列表:

List<EmployeeSummary> listA
List<Employee> listB

我想检查listA中的所有员工是否都是根据EmployeeSummary.class和Employee.class中使用的公共属性"code"在listB中表示的。两个列表的大小应该相同,员工也应该相同。

如果没有,我想抛出一个例外。我在想:

if(!listA.stream().allMatch(listB::getCode)){
throw new DummyException()
}

如何表示第二个列表和要比较的属性?

(PS:上面表示的"listB::getCode"不起作用(:(

我想避免有一个内部流。

您可以检查listA的所有元素是否存在于listB

boolean isSame = listA.stream()
.allMatch(a -> listB.stream()
.anyMatch(b -> b.getCode().equals(a.getCode())));

您可以从列表中创建一组code,并检查O(1(中包含的内容

Set<String> set = listB.stream().map(e -> e.getCode()).collect(Collectors.toSet());

然后你可以在集合中找到每个列表元素的

boolean isSame = listA.stream().allMatch(a -> set.contains(a.getCode()));

您需要首先将两个列表的元素配对在一起。Kotlin做这件事要容易得多,但在java中应该可以这样做:

IntStream.range(0, Math.min(listA.size(), listB.size()))
.mapToObj(i -> new Map.SimpleEntry<>(listA.get(i), listB.get(i)))
.allMatch(entry -> entry.getKey().getCode().equals(entry.getValue().getCode());

最新更新