java - 使用 List java 流时对 Set 对象进行嵌套过滤

标签 java java-stream

需求是根据嵌套的Set对象过滤List。我已经尝试过anyMatch,但似乎它对我不起作用,理想情况下它应该返回 List,它对嵌套 Set 进行过滤。

假设我有契约(Contract)列表 契约(Contract) 1 、契约(Contract) 2。

Contract1 has Set<Activity> = {"START","STOP","WAIT"}

Contract2 has Set<Activity> = {"START", "STOP"}

因此,在这种情况下,最终输出将根据 Activity 类型“START”过滤列表,它应该返回契约(Contract) 1 仅具有 START Activity 的列表,并且与契约(Contract) 2 相同。

**class Contract

public String name;
public Set<Activity> activities;

class Activity

private ActivityType activityType; //enum**



// method for filter list based on the activity type

List<Contract> filterOnActivityList = contractList.stream().filter(contract -> contract.getActivities().stream().anyMatch(activity -> activity.getActivityType().equals("START")))).collect(toList());

最佳答案

据我了解您的问题,您有一个 List Contract 对象。每个 Contract 对象都包含一个 Set Activity 对象。 Activity 对象具有其 ActivityType(其中 ActivityType 是一个 enum)。您想要迭代 List 中的每个 Contract 并检查其 ActivitySet 是否包含 ActivityActivityTypeSTART,并且您想要提取该 Activity 并收集所有提取的 Activity对象放入另一个单独的 List 中。

这是代码。它使用 Java 9 中引入的方法。(请注意,我猜测并填补了您在问题中发布的代码中的许多空白,例如类 Activity 和类 ContractActivityType 枚举)。代码后面有说明。

import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

public class Contract {
    private Set<Activity> activities;

    public Contract() {
        activities = new HashSet<>();
    }

    public Set<Activity> getActivities() {
        return activities;
    }

    public void setActivities(Set<Activity> activities) {
        this.activities = activities;
    }

    public static void main(String[] args) {
        Activity a0 = new Activity(ActivityType.OTHER);
        Activity a1 = new Activity(ActivityType.START);
        Activity a2 = new Activity(ActivityType.THAT);
        Contract c0 = new Contract();
        c0.setActivities(Set.of(a0, a1, a2));
        Activity a3 = new Activity(ActivityType.STOP);
        Activity a4 = new Activity(ActivityType.THAT);
        Activity a5 = new Activity(ActivityType.THIS);
        Activity a6 = new Activity(ActivityType.OTHER);
        Contract c1 = new Contract();
        c1.setActivities(Set.of(a3, a4, a5, a6));
        Activity a7 = new Activity(ActivityType.STOP);
        Activity a8 = new Activity(ActivityType.START);
        Contract c2 = new Contract();
        c2.setActivities(Set.of(a7, a8));
        List<Contract> contracts = List.of(c0, c1, c2);
        List<Activity> starts = contracts.stream()
                                         .flatMap(c -> c.getActivities().stream())
                                         .filter(a -> a.getActivityType().equals(ActivityType.START))
                                         .collect(Collectors.toList());
        System.out.println(starts);
    }
}

enum ActivityType {
    START, STOP, THIS, THAT, OTHER;
}

class Activity {
    private ActivityType activityType;

    public Activity(ActivityType type) {
        activityType = type;
    }

    public ActivityType getActivityType() {
        return activityType;
    }

    public String toString() {
        return activityType.name();
    }
}

在方法 main() 中(在上面的代码中),我创建了一个包含三个 Contract 对象的 List,其中每个对象包含不同的 Activity 对象集。请记住,Set 不包含重复项。

“流”操作获取每个Contractactivities 并创建ActivityStream(此这是 flatMap() 方法的作用)。换句话说,方法 flatMap() 返回 Stream Activity 对象。该流经过过滤,只有 ActivityTypeSTARTActivity 通过过滤器。最后,通过过滤器的每个 Activity 都被收集到一个新的 List 中,该列表仅包含其 ActivityTypeActivity 对象。是开始

运行上述代码的输出是

[START, START]

因为只创建了两个这样的对象。

(现在我猜你可能会写这样的评论:这根本不是我问的:-)

关于java - 使用 List java 流时对 Set 对象进行嵌套过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61948524/

相关文章:

java - 在 Spring MVC 中流式传输 JSON 输出

java - 如何在 netbeans JFrame 编辑器中显示自定义对话框?

java - 具有 2 个不同数据的 JTable

java - 如何监听聚焦子事件

java - imageJ 插件参数

java - 使用 Java 8 Streams 如何使用一个列表获取两个不同的列表

java - 寻找一种解析多类型 JSON 字段的方法

java - 在特定情况下使用 Java Stream 映射和过滤响应代码

java - 分组,但简洁​​地变换值元素

Java 8/9 : Can a character in a String be mapped to its indices (using streams)?