试图从结构中获取项目列表并避免大量循环和 ifs,所以我想使用 Stream
例如,让我们有以下结构:
class House {
List<Family> familyList;
}
class Family {
List<Person> personList;
String someInfo;
}
class Person {
String name;
int age;
List<Item> itemList;
}
class Item{
String name;
}
我要创建:
-
List<Item>
来自家庭 -
List<Item>
来自按姓名过滤的家庭 - 列表
from house, which contain only records filtered by
项目`名称
到目前为止,我尝试了以下方法:
List testItems = house1.familyList.stream().flatMap(f -> f.personList.stream().flatMap(p ->p.itemList.stream())) .collect(Collectors.toList()); 列出 testItems = house1.familyList.stream().flatMap(f -> f.personList.stream()).flatMap(p->p.itemList.stream()) .collect(Collectors.toList());
List testItemsFiltered= house1.familyList.stream().flatMap(f -> f.personList.stream().flatMap(p ->p.itemList.stream().filter(item->item. name.equals("锤子")))) .collect(Collectors.toList());
但两者都抛出空指针
对于 3. variant 到目前为止我还不知道
凯文编辑:
检查:familiList 包含几个 Item
名称 - “item1”,“item2”,“item3”
List<Family> filteredFamilies = house1.familyList.stream()
.filter(f -> f.personList.stream()
.anyMatch(p ->p.itemList.stream()
.anyMatch(i -> i.name.equals("item1"))))
.collect(Collectors.toList());
for (Family family : filteredFamilies) {
for (Person p : family.personList) {
for (Item i : p.itemList) {
System.out.println(i.name);
}
}
}
结果:
item1
item2
item2
item3
item1
item2
item2
item3
过滤前:
f1-
_p1- it1,it2
_p2- it2,it3,it4
f2
_p3- it1,i2
_p4 i3
f3
_p5 i5
过滤后:
f1-
p1- it1
f2
p3-it1
最佳答案
我尝试了第一个代码:
List<Item> testItems = house1.familyList.stream()
.flatMap(f -> f.personList.stream()
.flatMap(p ->p.itemList.stream()))
.collect(Collectors.toList());
并且此代码有效。看来您没有在开始时初始化列表。所以我建议在构造函数中初始化它们,NullPointer
应该消失。此外,当列表为空时,不会出现 NullPointer
。
这段代码应该返回每个 family
,它有一个 person
和一个特定的 item
:
String expectedItem = "test";
List<Family> families = house1.familyList.stream()
.filter(f -> f.personList.stream()
.anyMatch(p ->p.itemList.stream()
.anyMatch(i -> i.name.equals(expectedItem))))
.collect(Collectors.toList());
根据问题,答案也有所改变:
String expectedItem = "test";
List<Family> families = house1.familyList.stream()
.filter(f -> f.personList.stream()
.anyMatch(p ->p.itemList.stream()
.allMatch(i -> i.name.equals(expectedItem))))
.collect(Collectors.toList());
关于java - 列表结构的流和过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37858342/