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

合并两个对象的列表以在公共属性的基础上创建第三个对象

厉钊
2023-03-14

我有两个不同的csv文件,其中包含两个不同实体上的数据,我必须合并两个不同的csv文件,以创建一个基于sql连接类型equijoin和left join的csv文件。

所以我创建了第一个实体作为类名客户,具有属性:

int CustomerId ;
String CustomerName;
int OrderId;

这个类的对象列表如下:

Customer c1 = new Customer(CustomerId, CustomerName, OrderId);
1 million objects..

List<Customer> cust = new ArrayList<>();
cust.add(c1);
cust.add(c2);
so on to make list of 1 million object.

类似地,我创建了具有属性的二阶实体类:

int orderId;
String orderName;
Date orderdate;

Order o1 = new Order(orderId, orderName, orderdate);
so on 1 million object
List<Oder> order = new ArrayList<>();

现在,我需要在orderId的基础上合并这两个对象,并生成第三个对象,其结果类具有上述两个类的所有属性。

请建议我使用java stream 8映射列表流以在第三个新结果类中创建内部连接和左连接类型示例的解决方案。

共有1个答案

百里胜泫
2023-03-14

除了getter之外,您的客户类应该具有以下方法:

public boolean orderMatch(Order order) {
    //fixed the attribute name so it would be in camelCase
    return orderId == order.getId();
}

当然,这意味着顺序有一个getter方法来获取其id属性。

最后,您需要一个CustomerExtended类。

class CustomerExtended {
    int customerId ;
    String customerName;
    Order customerOrder;

    public CustomerExtended(Customer customer, Order order) {
        customerId = customer.getId();
        customerName = customer.getName();
        customerOrder = order;
    }
}

现在,您可以创建一个Function来搜索相应的订单并将其附加到客户

Function<Customer,CustomerExtended> extendCustomer = (c) ->{
    //I used the more descriptive name orderList instead of o1.
    Optional<Order> order = orderList.stream()
                                     .filter(c::orderMatch)
                                     .findFirst();
    if(order.isPresent()) {
        return new CustomerExtended(c,order.get());
    }
    return null;
};

然后您可以通过地图将其应用于客户列表。

List<CustomerExtended> newCustomerList = customerList.stream()
                                                     .map(c -> extendCustomer.apply(c))
                                                     .collect(Collectors.toList());

编辑:最后几条注释

  • 在将对象添加到列表或填充列表时,应该检查ID号是否重复
  • 出于语义目的,应该将客户对象重命名为CustomerOrder,或者将其分为仅用于客户信息的对象和存储客户和订单之间关系的对象
  • 找不到订单的情况应该更好地处理,并引发异常
 类似资料:
  • 我有一个Java类,它有20个属性及其相应的getter和setter。还有两个对象列表:和。 使用Java 8: 但是我必须在哪个地方指定属性呢?是否应该重写和方法?

  • 我有一个包含多个字段和两个对象的列表,我的要求是形成一个

  • 问题内容: 我有一个带有20个属性的Java类及其相应的getter和setters。我也有两个对象列表:和。 现在,我想合并两个列表,并避免基于和的重复对象。 使用Java 8: 但是我必须在哪里指定属性?我应该重写和方法吗? 问题答案: 如果要实现and ,则 在 类 内部 进行操作。在该类中添加类似的方法 如果您这样做了,在上调用将自动执行正确的操作。 如果您不想(或无法)更改类,则没有平等

  • 问题内容: 我需要能够在运行时合并两个(非常简单的)JavaScript对象。例如,我想: 有没有人为此提供脚本或知道内置的方式来执行此操作?我不需要递归,也不需要合并函数,只需合并平面对象上的方法即可。 问题答案: ECMAScript 2018标准方法 您将使用对象传播: 现在是和的并集。中的属性将覆盖中的属性。 这也是此语法的MDN文档。如果您正在使用babel,则需要babel-plugi

  • 我有这两个类,它们都有一个项目列表,我试图返回一个新对象“ItemWithDiscount”,它具有这两个类的属性,这在服务/控制器申请中。我尝试用流映射它们,但没能做到。谁能给我一个简单的方法来做这件事吗?

  • 问题内容: 我有以下输入-2个json文件,一个是基础文件,第二个包含相同的属性,但值不同,我想合并这些对象。 例如: 第二个文件: 结果应该是这样的: 使用powershell可以做到吗? 问题答案: (请参见下面的更新) 结果: 您可能会考虑不覆盖左值: 在这种情况下,结果将是: 更新2019年11月16日 的参数已经被耗尽,分过和参数(遗憾的重大更改)。好消息是,对象合并的默认参数设置包含在