2016-10-12 2 views
0

У меня есть два объекта arraylist orderList, productList и один String arraylist customerIdList.
У меня есть ProductInfo POJO для сопоставления с orderList и productList, где cuustomerId должен совпадать.
Если у меня нет заказа или товарного списка для данного ProdId, я должен добавить стандартную ошибку и перейти к ошибке ProductInfo.

Вот что я делаю ...эффективный путь к loopoever три списка массивов для сравнения значений

public class ProductInfo { 
    private List<ProductDetails> products; 
    private List<Error> errors; 
    private String customerId; 
} 

public class ProductDetails { 
    private String customerId; 
    private Order order; 
    private Product product; 
    private List<Error> errors; 
} 

Пример результата ...

{ 
    "productInfo": { 
     "customer_id": "123", 
     "product_details": [ 
     { 
      "customer_id": "123", 
      "order_details": null, 
      "product_details": { 
       "customer_id": "123" 
       "product_id" : "2343" 
       "product_name": "XYZ", 
       "product_type": "PQR" 
       ... 
      }, 
      "errors": [ 
       "error_code":"6001", 
       "error_desc":"Failure in getting Order information from Order Service" 
      ] 
     }, 
     { 
      "order_details": { 
       "customer_id":"123" 
       "order_id": "3543454", 
       "order_date":"2016-10-12", 
       "order_status":"ordered" 
      }, 
      "product_details": null, 
      "errors": [ 
       "error_code":"6001", 
       "error_desc":"Failure in getting Product information from Product Service" 
      ] 
     } 
     ], 
     "system_errors":[] 
    } 
} 

LOOPING над ArrayList и Mapping

for(String customerId : customerIdList) { 
    for(Product product: productList) { 
     for(SOrder ordr: orderList) { 
      if(customerId.equals(product.getCustomerId()) && customerId.equals(Order.getCustomerId())) { 
       ModelMapper mapper = new ModelMapper(); 
       Order order = mapper.map(ordr, Order.class)); 
       productDetails.setOrder(order); 
       //mapping to ProductInfo 
       productDetailsList.add(productDetails); 
      } 
     } 
    } 
} 

Я хочу знать, если есть какие-либо лучший способ сделать это, а также я использую ModelMapper, чтобы нанести на карту SOrder до Order POJO и
других POJO хотели бы знать, имеется ли какой-либо другой эффективный сопоставитель моделей.
Спасибо.

ответ

0

вы можете создавать карты из productList и orderList с customerId в качестве ключа

Map<String, Product> productMap = productList.stream().collect(Collectors.toMap(p -> p.getCustomerId(), p -> p)); 
Map<String, Product> orderMap = orderList.stream().collect(Collectors.toMap(o -> o.getCustomerId(), o -> o)); 

тогда только с одной петлей, вы можете проверить, есть ли продукт и порядок для этого клиента идентификатор

for(String customerId : customerIdList) { 
    if (productMap.containsKey(customerId) && orderMap.containsKey(customerId)) { 
    //do your mapping stuff here 
    } 
} 
+0

Он бросает пустой исключение указателя, если какой-либо из Продукта или Заказ не существует – user1653027

+0

@ user1653027 Отфильтровать идентификаторы, которые являются нулевыми. .filter (объекты :: ненулевой) –