2017-12-27 23 views
-1

두 개의 배열 목록이 있습니다. 두 번째 배열 목록의 필드 개체 ​​요소 중 일부에서 첫 번째 배열 목록에 채우기 개체 요소가 필요하며이 프로젝트는 최상의 성능을 필요로합니다. 이 문제를 해결하는 가장 좋은 방법은 나를 위해.두 배열 배열을 첫 번째 배열의 구조 필드와 병합하십시오

제 배열에서의 객체의 구조 및 ArrayList <SellProductAmountDTO> 채우기 SellContractProduct 이드와 SellProductAmountDTO sellContractId 조건부 필드가 객체 OrderProductDTO.

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

및 OrderProductDTO의 stucture :

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

와 두 번째 배열 목록의 객체 stucture 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

으로 더 나은 성능을 가질 수 있는가? 네가 무엇을 요구하는지 알 수 없다. – shmosel

+0

SellContractProduct리스트가 꽉 차서 OrderProductDTO의 costGroupId와 productId를 SellContractProduct에서 SellProductAmountDTO의 sellContractId가있는 조건부 SellContractProduct의 ID로 채 웁니다. – batnight

+0

수행하려고 시도하고 목록을 표시하는 초기 코드를 제공하십시오 – tkruse

답변

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