我有两个对象的数组列表,我需要从第二个数组列表中的一些字段对象元素填充第一个数组列表中的对象元素,这个项目需要最佳性能请指导我找到解决这个问题的最佳方法。
第一个数组列表的对象结构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<SellContractProduct>
:
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
}
答案 0 :(得分: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());
}
}