java - 列表结构的流和过滤器

标签 java java-8 java-stream

试图从结构中获取项目列表并避免大量循环和 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;    
}

我要创建:

  1. List<Item>来自家庭
  2. List<Item>来自按姓名过滤的家庭
  3. 列表 from house, which contain only records filtered by项目`名称

到目前为止,我尝试了以下方法:

  1. 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());

  2. 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/

相关文章:

java - Collectors (Java) 中的 groupingby 和映射有什么区别?

java - 如何使用 Stream API 展平此 List<C1>,其中 C1 包含单个元素的 C2 集合?

java - 转换逻辑以使用 Java 8 Streams

java - java.util.stream.Stream<T>.sorted() 的大 O 复杂度

java - 工厂方法与抽象工厂

java - 在JDK8中,我可以只使用一个流表达式来获得两个条件的结果吗?

java - 如何以 Java 8 方式获取特定 URL 上的文本行流?

java - 如何管理我的图层?

java - 使用 gson 将自定义数组列表保存到 Sharedpreferences

java - 从过滤器中的数据库对用户进行身份验证是一种好习惯吗?