【发布时间】:2020-05-17 02:34:45
【问题描述】:
有没有什么方法可以使用 Lambda Stream 根据 Set 过滤 Stream 或 List 中的 Set 字段?
例子:
List<Person> persons = new ArrayList<Person>();
Set<String> hobbySet1 = new HashSet<String>();
hobbySet1.add("H1");
hobbySet1.add("H2");
hobbySet1.add("H3");
Set<String> hobbySet2 = new HashSet<String>();
hobbySet2.add("H2");
hobbySet2.add("H4");
Set<String> hobbySet3 = new HashSet<String>();
hobbySet3.add("H3");
Set<String> hobbySet4 = new HashSet<String>();
hobbySet4.add("H4");
persons.add(new Person("P1", hobbySet1));
persons.add(new Person("P2", hobbySet2));
persons.add(new Person("P3", hobbySet3));
persons.add(new Person("P4", hobbySet4));
Set<String> searchHobby = new HashSet<String>();
searchHobby.add("H1");
searchHobby.add("H3");
我想根据 searchHobby 从 List people 中筛选出爱好,以便只保留那些在 searchHobby 中指定了爱好的人。
我知道如何使用简单的 for 循环来实现这一点。
List<Person> result = new ArrayList<Person>();
for (String sHobby : searchHobby) {
for (Person p : persons) {
Set<String> pHobbySet = p.getHobbies();
for (String pHobby : pHobbySet) {
if (pHobby.equalsIgnoreCase(sHobby)) {
Optional<Person> wasAdded = result.stream().filter(s->s.getName()==p.getName()).findAny();
if(wasAdded.isEmpty()) {
result.add(p);
break;
}
}
}
}
}
我正在寻找 java Stream Filter 解决方案。
附: 人
public class Person {
String name;
Set<String> hobbies;
public Person(String name, Set<String> hobbies) {
this.name = name;
this.hobbies = hobbies;
}
public String getName(){
return name;
}
public Set<String> getHobbies(){
return hobbies;
}
}
【问题讨论】:
-
List<Person> collect = persons.stream().filter(s -> s.getHobbies().containsAll(searchHobby)) .collect(Collectors.toList()); -
请注意,在您的示例中,
hobbySet3和hobbySet4为空 -
@Ruslan,我更正了示例 [hobbySet3] 和 [hobbySet4],谢谢!
标签: java filter collections set java-stream