首页 > 解决方案 > Java 流 - 基于子项的过滤器

问题描述

我有每个人的列表都有列表。手机有brandName 和modelNumber。如何使用 Java 流过滤 modelNumber 等于某个值的 Person 列表。在下面的代码中,我需要过滤 modelNumber 为 10 的 Persons

public static void main(String[] args) {
        
        Integer searchModel = 10;
        
        List<Person> persons = new ArrayList<>();
        CellPhone a1 = new CellPhone("Nokia", 10);
        CellPhone a11 = new CellPhone("Sony", 11);
        List<CellPhone> phoneList = new ArrayList<>();
        phoneList.add(a11);
        phoneList.add(a1);
        Person p1 = new Person("John", phoneList);
        
        CellPhone a2 = new CellPhone("Nokia", 10);
        CellPhone a22 = new CellPhone("Sony", 11);
        phoneList = new ArrayList<>();
        phoneList.add(a2);
        phoneList.add(a22);
        Person p2 = new Person("Doe", phoneList);
        
        CellPhone a3 = new CellPhone("Apple", 20);
        CellPhone a33 = new CellPhone("Samsung", 22);
        phoneList = new ArrayList<>();
        phoneList.add(a3);
        phoneList.add(a33);
        Person p3 = new Person("Rose", phoneList);
        
        CellPhone a4 = new CellPhone("Nokia", 10);
        CellPhone a44 = new CellPhone("Sony", 11);
        phoneList = new ArrayList<>();
        phoneList.add(a4);
        phoneList.add(a44);
        Person p4 = new Person("Kumar", phoneList);
        
        CellPhone a5 = new CellPhone("Apple", 20);
        CellPhone a55 = new CellPhone("Samsung", 22);
        phoneList = new ArrayList<>();
        phoneList.add(a5);
        phoneList.add(a55);
        Person p5 = new Person("Angel", phoneList);
        
        CellPhone a6 = new CellPhone("Apple", 20);
        CellPhone a66 = new CellPhone("Samsung", 22);
        phoneList = new ArrayList<>();
        phoneList.add(a6);
        phoneList.add(a66);
        Person p6 = new Person("Prince", phoneList);
        
        persons.add(p1);
        persons.add(p2);
        persons.add(p3);
        persons.add(p4);
        persons.add(p5);
        persons.add(p6);
        
        
        persons.stream().filter(p -> p.getPhones().stream().filter(x -> x.getModelNumber().equals(searchModel)).collect(Collectors.toList()));
    
    // expected Person list is John, Doe and Kumar
    // above filter gives me an error cannot convert from list to boolean
    }

标签: javajava-stream

解决方案


.filter期望Predicate并且您的代码没有此用于外部.filter.

你可以这样做:

persons.stream()
    .filter(p -> p.getPhones().stream()
                    .anyMatch(x -> x.getModelNumber() == searchModel)
    ).collect(Collectors.toList()));

请注意,如果返回类型getModelNumber()int,则需要使用==而不是.equals


推荐阅读