【问题标题】:Merging list of two objects to create a third object on the basis of common attribute合并两个对象的列表以在公共属性的基础上创建第三个对象
【发布时间】:2018-03-13 19:50:00
【问题描述】:

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

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

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.

同样,我创建了具有属性的第二个实体 Order 类:

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 流 8 映射列表流以在第三个新结果类中创建内连接和左连接类型示例的解决方案。

【问题讨论】:

  • 您使用List 并想使用流的任何特殊原因?
  • 基本上我想读取两个不同的 csv 文件,其中一列具有主键和外键关系。并使用 java 我想处理这两个 csv 以使用 sql 连接创建一个 csv 连接或等连接或左连接,具体取决于连接两个 csv 的请求,但应用程序应支持这两种连接类型。我从这个逻辑开始创建对象列表并考虑使用 java 8。如果你知道,请给我一个更好的方法。谢谢
  • 你说的sql是什么意思?你想使用数据库吗?您可以在内存中使用h2,您可以将 csv 文件直接加载到其中并从中写入。
  • 并且在第二个文件中,我们在左连接中得到的结果是第一个文件中的所有数据,如果第二个文件列值不存在,则为空:

标签: java arraylist merge java-stream


【解决方案1】:

除了 getter,你的 Customer 类应该有以下方法:

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

当然,这意味着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,它将搜索相应的Order 并将其附加到Customer

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

然后您可以通过映射将其应用到Customer 列表中。

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

编辑:最后几点说明

  • 在将对象添加到列表或填充列表时,应检查 ID 号是否重复。
  • 出于语义目的,应将 Customer 对象原样重命名为 CustomerOrder 或分离为仅用于客户信息的对象和存储客户与订单之间关系的对象。
  • 找不到订单的情况应该更好处理,抛出异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2019-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多