【问题标题】:merge two array list of object with structure fields in first array将对象的两个数组列表与第一个数组中的结构字段合并
【发布时间】:2017-12-27 06:41:36
【问题描述】:

我有两个对象数组列表,我需要从第二个数组列表中的一些字段对象元素中填充第一个数组列表中的对象元素,这个项目需要最佳性能,请指导我解决这个问题的最佳方法。

第一个数组列表的对象结构ArrayList <SellProductAmountDTO> 和 用 SellProductAmountDTO 的条件 sellContractId 字段填充 OrderProductDTO 对象,其中 id 为 SellContractProduct。

public class SellProductAmountDTO {
    private Long sellContractId;
    private Long amount;
    private OrderProductDTO orderProduct;
    //getter ans setters
}

和 OrderProductDTO 结构:

public class OrderProductDTO {
    private List<Long> costGroupId;
    private Long productId;
}

第二个数组列表的对象结构ArrayList&lt;SellContractProduct&gt;:

public class SellContractProduct{

    private Long id;

    private Long rateGroupId;

    private Long currencyRateGroupId;

    private Set<BuyType> buyTypes;

    private Consumption consumption;

    private Long productId;

    private SellContractCustomer sellContractCustomer;

    private Set<Depot> depots = new HashSet<>();

    private List<Long> costGroupIds;

    private List<Long> currencyIds;

    //getter and setters
}

【问题讨论】:

  • 你能再努力一点来解释你的问题吗?我不知道你在问什么。
  • SellContractProduct 列表已满,我将使用 SellProductAmountDTO 的 sellContractId 填充 SellContractProduct 中的 OrderProductDTO 的 costGroupId 和 productId 以及条件 SellContractProduct 的 id
  • 提供一些初始代码,显示您尝试执行的操作以及列表的大小

标签: java arrays java-stream


【解决方案1】:

如果我正确理解您的问题,这应该可以:

List<SellProductAmountDTO> sellProductAmountDTOList = new ArrayList<>(); // this should be full
List<SellContractProduct> sellContractProductList = new ArrayList<>(); // this should be full

// build a stream on array 2 to use in the for loop
Stream<SellContractProduct> SellContractProductListStream = sellContractProductList.stream();

for(SellProductAmountDTO sellProductAmountDTO : sellProductAmountDTOList) {
    // find the correct SellContractProduct
    Optional<SellContractProduct> productOption = SellContractProductListStream
            .filter(sellContactProduct -> sellContactProduct.getId().equals(sellProductAmountDTO.getSellContractId()))
            .findFirst();

    // if the SellContractProduct was found, then set its values into the sellProductAmountDTO's order product
    if(productOption.isPresent()) {
        sellProductAmountDTO.getOrderProduct().setProductId(productOption.get().getId());
        sellProductAmountDTO.getOrderProduct().setCostGroupId(productOption.get().getCostGroupIds());
    }
}

编辑可能有更好的地图性能

List<SellProductAmountDTO> sellProductAmountDTOList = new ArrayList<>(); // this should be full
List<SellContractProduct> sellContractProductList = new ArrayList<>(); // this should be full

// make a map listing contracts by their Id
Map<Long, SellContractProduct> SellContractProductMap = sellContractProductList.stream()
        .collect(Collectors.toMap(SellContractProduct::getId, Function.identity()));

for(SellProductAmountDTO sellProductAmountDTO : sellProductAmountDTOList) {
    // find the correct SellContractProduct in the map
    SellContractProduct product = SellContractProductMap.get(sellProductAmountDTO.getSellContractId());

    if(product != null) {
        sellProductAmountDTO.getOrderProduct().setProductId(product.getId());
        sellProductAmountDTO.getOrderProduct().setCostGroupId(product.getCostGroupIds());
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-06
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    • 2020-12-15
    相关资源
    最近更新 更多