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

时间:2020-05-22 05:38:14

标签: java java-stream

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

假设我有合同清单合同1,合同2。

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

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

因此,在这种情况下,最终输出将按活动类型“ START”过滤列表,它应返回合同1仅具有START活动且与合同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());

1 个答案:

答案 0 :(得分:0)

据我所知,您有ListContract对象。每个Contract对象包含Activity个对象中的Set个。 Activity对象具有其ActivityType(其中ActivityTypeenum)。您想遍历Contract中的每个List,并检查其Set中的Activity是否包含ActivityActivityType START ,您想提取该Activity并将所有提取的Activity对象收集到另一个单独的List中。

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

ActivityType

在方法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()对象组成的List,其中每个对象包含Contract个对象中的一个不同的Set。请记住,Activity不包含重复项。

“流”操作采用每个Set的{​​{1}}并创建activities的{​​{1}}(这是Contract方法的作用)。换句话说,方法Stream返回Activity个对象中的Stream个。对该流进行过滤,以使只有flatMap() START flatMap()通过过滤器。最后,每个通过过滤器的Activity都会被收集到一个新的Activity中,其中仅包含ActivityType START Activity个对象。

运行上述代码的输出是

List

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

(现在,我想您可能会写一条评论,例如:那根本不是我要的:-)