比较不同对象的列表并使用Stream在java8中构建新的对象列表

星星

有人可以帮助我使用流将以下代码转换为 java 8 标准吗?

迭代 CustomerRelationship 列表和客户列表,比较 customerRelationShip firstName 和 customer firstName。如果匹配,则使用 customerRelationShip 和客户对象构造 BusinessCustomer 对象并将其添加到 businessCustomerList。如果没有匹配项,则使用 customerRelationShip 构造 BusinessCustomer 并将其添加到 businessCustomerList。

List<BusinessCustomer> businessCustomers = new ArrayList<BusinessCustomer>();

List<CustomerRelationship> customerRelationshipList = new ArrayList<CustomerRelationship>();

       List<Customer> customerList = new ArrayList<Customer>();

        for (CustomerRelationship customerRelationship: customerRelationshipList) {
            int temp = 0;
            for (Customer customer:customerList){
                if(customer.getFirstName().equalsIgnoreCase(customerRelationship.getFirstName()))
                {
                    temp++;
                    BusinessCustomer b = new BusinessCustomer();
                    b.setAge(customer.getAge());
                    b.setFirstName(customerRelationship.getFirstName());
                    b.setLastName(customerRelationship.getLastName());
                    businessCustomers.add(b);
                }
            }
            if(temp == 0) {
                BusinessCustomer b = new BusinessCustomer();                
                b.setFirstName(customerRelationship.getFirstName());
                b.setLastName(customerRelationship.getLastName());
                businessCustomers.add(b);
            }
        }

我已经使用流开发了这样的东西。

List<CustomerRelationship> customerRelationshipList = Fetch from the Table (CustomerRelationship)
       List<Customer> customerList = Fetch from the Table (Customer)
       List<BusinessCustomer> businessCustomers = customerRelationshipList.stream()
                .flatMap(c -> customerList.stream()
                .filter((d -> (c.getFirstName()
                                .equals(d.getFirstName()))
                        ))
                        .map(d -> new BusinessCustomer(c.getFirstName(),c.getLastName(),d.getAge()))
                .collect(Collectors.toList());

仅当 customerRelationship firstName 与 customer firstName 匹配时,上面的代码才会创建 businessCustomers。期望是:即使没有匹配项,我也想通过使用 customerRelationship 对象来创建 businessCustomers(请检查上面执行此操作的 foreach 代码)。

马修·米查姆

我相信以下两种方法中的任何一种都有效:

第一个使用Stream.concat它使您能够将两个流放在一起。

    Stream<BusinessCustomer> matches = customerRelationships.stream()
            .flatMap(relationship -> customers.stream()
                    .filter(customer -> customer.getFirstName().equalsIgnoreCase(relationship.getFirstName()))
                    .map(customer -> new BusinessCustomer(relationship.getFirstName(), relationship.getLastName(), customer.getAge())));

    Stream<BusinessCustomer> nonMatches = customerRelationships.stream()
            .filter(relationship -> customers.stream().noneMatch(customer -> customer.getFirstName().equalsIgnoreCase(relationship.getFirstName())))
            .map(relationship -> new BusinessCustomer(relationship.getFirstName(), relationship.getLastName()));

    List<BusinessCustomer> result = Stream.concat(matches, nonMatches)
            .collect(Collectors.toList());

你可以或者不能创建两个中间matchesnonMatchesStream对象,只是把在这些发言Stream.concat

我认为可行的另一种方法如下:

    customerRelationships.stream()
            .flatMap(relationship -> {
                boolean noneMatch = customers.stream().noneMatch(customer -> customer.getFirstName().equalsIgnoreCase(relationship.getFirstName()));
                if (noneMatch) {
                    return Stream.of(new BusinessCustomer(relationship.getFirstName(), relationship.getLastName()));
                } else {
                    return customers.stream()
                            .filter(customer -> customer.getFirstName().equalsIgnoreCase(relationship.getFirstName()))
                            .map(customer -> new BusinessCustomer(relationship.getFirstName(), relationship.getLastName(), customer.getAge()));
                }
            })
            .collect(Collectors.toList());

另外,我还没有测试这两种方法,所以一定要通过你自己的一组测试来运行它们。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Java8 Stream计算列表中的对象数

基于java 8中的匹配属性比较两个不同对象类型的列表

使用 Java 8 Stream API 将 2 个不同对象的列表组合成单个对象的列表

如何创建使用具有使用Java流性质不同的对象列表中不同对象的列表

使用Java 8流将2个不同对象的列表连接到第三个对象的列表

如何使用Java 8中的流API通过同一类的不同对象填充数组列表?

比较2个具有不同对象的列表Java返回不匹配的列表

连接不同对象的列表

不同对象的映射列表

按名称比较两个对象列表并获取不同对象的列表

列表中的相同对象

Java 8将BiFunction应用于两个不同对象的列表

C#采用两个不同对象的列表来构造新的对象列表

根据属性值检索列表中的不同对象

如何在python中打印不同对象的列表?

如何使用 Codable 解析不同对象列表的 Json 数组?

Java8:对列表中对象的特定字段的值求和

Java8流使用流畅的API减少对象列表

Java8:按键映射对象列表

在Java中,如何检查不同对象的两个数组列表中缺少的元素?

创建不同对象的列表副本

如何比较powershell中的不同对象

使用Java流在列表中的相同对象下合并列表

如何使用Java 8流将两个或更多不同对象列表的值设置为一个对象?

通过从列表中删除一个对象(具有重复对象的不同对象)来创建新的非重复列表

比较2个列表,然后使用Java8将匹配项添加到对象映射中

Java 8 Streaming Filter&Collect是否返回对列表中相同对象的引用?

比较对象列表中的给定值-Java 8

java8 remove从对象基础条件对象列表