要求是根据嵌套的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());
答案 0 :(得分:0)
据我所知,您有List
个Contract
对象。每个Contract
对象包含Activity
个对象中的Set
个。 Activity
对象具有其ActivityType
(其中ActivityType
是enum
)。您想遍历Contract
中的每个List
,并检查其Set
中的Activity
是否包含Activity
为的ActivityType
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
因为只创建了两个这样的对象。
(现在,我想您可能会写一条评论,例如:那根本不是我要的:-)