使用Java8过滤两个列表

时间:2019-07-29 19:36:33

标签: java spring

我有两个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,因此在执行任务时遇到困难。

有人可以帮我吗?

2 个答案:

答案 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());