我有两个ArrayList,其中包含一个包含大量数据的用户定义类的列表。其中一个列表包含另一个列表的元素。
我想从list1过滤掉新列表3中已经存在于list2中的数据。
我可以在循环的帮助下执行此操作,但是由于数据量很大,所以我不想使用循环。
Example:
List<Presentation> presentedDepartmentList //list 1
List<PresentationDetails> excludingDepartmentList //list 2
Both Presentation and PresentationDetails have a common field as
"departmentNumber". I want to filter out the entries in the
"excludingDepartmentList" from the "presentedDepartmentList".
由于我不熟悉Java8,因此在执行任务时遇到困难。
有人可以帮我吗?
答案 0 :(得分:1)
这应该做:
List<Presentation> filteredList = presentedDepartmentList.stream().filter(this::shouldBeIncluded).collect(Collectors.toList());
....
public boolean shouldBeIncluded(Presentation presentation) {
!(excludingDepartmentList.stream().filter(a -> presentation.departmentNumber().equals(a.departmentNumber())).findAny().isPresent());
}
答案 1 :(得分:1)
如果根据大小为M的列表过滤大小为N的一个集合,则所需时间将为O(N * M)。如果M大,首先将其转换为哈希集,那么您的时间将为O(N + M)。
Set<String> exclusions = excludingDepartmentList.stream()
.map(PresentationDetails::getDepartmentNumber)
.collect(Collectors.toSet());
List<Presentation> filtered = presentedDepartmentList.stream()
.filter(p -> !exclusions.contains(p.getDepartmentNumber()))
.collect(Collectors.toList());