【问题标题】:Filtering Two lists with Java8使用 Java8 过滤两个列表
【发布时间】:2019-12-07 04:20:38
【问题描述】:

我有两个 ArrayList,其中包含一个包含大量数据的用户定义类的列表。其中一个列表包含另一个列表的元素。

我想在新的 list3 中过滤掉 list1 中已经存在于 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 不熟悉,所以我在任务中遇到了困难。

谁能帮帮我?

【问题讨论】:

    标签: java spring


    【解决方案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());
    }
    

    【讨论】:

    • 这也有效。我将另一个标记为正确,因为它是更好的方法。感谢您的帮助和时间。
    • 哈哈当然谢谢。您可以随时为您认为有帮助的答案投票。
    【解决方案2】:

    如果您针对一个大小为 M 的列表过滤一个大小为 N 的集合,则所需时间将为 O(N*M)。如果M很大,先转换成hash set,那么你的时间就是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());
    

    【讨论】:

    • 该死的,这是一个更好的解决方案。
    • 感谢您的帮助。非常感谢
    猜你喜欢
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2019-05-25
    相关资源
    最近更新 更多