当前位置: 首页 > 知识库问答 >
问题:

列表结构的流和筛选器

党星鹏
2023-03-14

试图从结构中获取项目列表,避免大量的for循环和if,所以我想使用stream

例如,lets具有以下结构:

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;    
}

我要创建:

    null

List TestitemsFiltered=House1.FamilyList.Stream().FlatMap(f->f.PersonList.Stream().FlatMap(p->p.ItemList.Stream().Filter(Item->Item.Name.Equals(“Hammer”))).Collect(Collectors.ToList());

但两者都抛出了空指针

三个。变体我还不知道

kevin Edit:
检查:familiList包含几个名称为“item1”、“item2”、“item3”的item

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

筛选前:

共有1个答案

公孙高轩
2023-03-14

我试了第一个代码:

List<Item> testItems = house1.familyList.stream()
               .flatMap(f -> f.personList.stream()
                   .flatMap(p ->p.itemList.stream()))
               .collect(Collectors.toList());

这段代码起作用了。似乎您没有在开始时初始化列表。因此我建议在构造函数中初始化它们,nullpointer应该消失。此外,当列表为空时,不会出现nullpointer

此代码应返回每个,该具有一个和一个特定的

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());
 类似资料:
  • 我正在制作一个过滤器,允许我生成一个映射,其值是文件列表,为此,我尝试使用流。我有以下文件列表示例: null 这段代码只是使用键将CLA文件保存在映射中的列表中。这是正确的,但我需要添加其余的文件。

  • 我需要过滤一个列表

  • 本文向大家介绍Kotlin 筛选列表,包括了Kotlin 筛选列表的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 列表筛选可以对地图中的数据按照事先设置好的列表模板进行查询。在第一次点击列表筛选时,会进入筛选定制页面,如下图: 点击确认后,开始进行筛选设置:点击新增按钮,可对某个字段添加筛选要求,添加后然后选择条件旁边加号按钮,以设置对某一列的具体筛选要求。 如上图的筛选条件为“名称包含迪亚”的售点,继续单击加号可以对名称列继续添加条件。如果需要对其他字段进行筛选,可以再次单击新增按钮增加条件,点击确定及保存

  • 我有一个产品集合,每个产品都会有: 价格 属性(例如:大小:xl,s,xxl;颜色:黄,红,蓝;....) 制造商 类别(一个产品可以有多个类别) 此集合在ElasticSearch中索引。现在,当我查询类别A中所有产品的列表时,我还希望获得: 所有产品的价格范围(最小-最大) 所有可能选项和值的列表(大小、颜色和相应的值xl、s、xxl、Yellog、red、blue) 制造商(耐克、阿迪达斯、

  • 我使用的是spring,我用定义了bean。它是一个包含对象的列表。 这是我的数据privider类: 在configuration类中,我从创建了-它可以工作。 在服务中,我想从列表中修改一个对象,该对象与令牌字符串匹配,并且已将设置为。 这条小溪运行良好。现在,当有人为已确认的对象调用方法两次时,我希望抛出。我怎么能用这条小溪做到这一点呢?我可以将放在哪里? 编辑: 我现在的解决方案。我使用而