假设我有两个列表:
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());