首页 > 解决方案 > 在Java中组合两个对象数组的理想方式是什么

问题描述

A类:

public class A{
   private String Id;
   private List<Product> products = new ArrayList<>();
}

public class Product{
   private String prodId;
   private String color;
   private String size;
}

例子:

A = { "Id": 1 , products: [{"prodId":"Prod1", "color":"Red", "size":"L"},
    {"prodId":"Prod2", "color":"Green", "size":"L"}] }  

B类:

public class B{
   private String Id;
   private List<ProductAvail> productAvail = new ArrayList<>();
}

public class ProductAvail{
   private String prodId;
   private String availability;
   private String region;
}

例子:

B =  { "Id": 1 , productAvail: [{"prodId":"Prod1", "availability":"Y", "region":"AA"},
     {"prodId":"Prod2", "availability":"N", "region":"BB"}] }

我想将它们组合成一个

public class C{
   private String Id;
   private List<Catalog> catalog = new ArrayList<>();
}

public class Catalog{
   private String prodId;
   private String color;
   private String size;
   private String availability;
   private String region;
}

C =  { "Id": 1 , catalog: [{"prodId":"Prod1", "color":"Red", "size":"L", "availability":"Y", "region":"AA"},
 {"prodId":"Prod2", "color":"Green", "size":"L", "availability":"N", "region":"BB"}] }

在不使用两个 for 循环的情况下,在 Java 中执行此操作的理想方法是什么?

标签: javaarraysspring

解决方案


鉴于:

String aJson = "{ \"id\": 1 ,\"products\": [{\"prodId\":\"Prod1\", \"color\":\"Red\", \"size\":\"L\"}, {\"prodId\":\"Prod2\", \"color\":\"Green\", \"size\":\"L\"}] }";
String bJson = "{ \"id\": 1 ,\"productAvail\": [{\"prodId\":\"Prod1\", \"availability\":\"Y\", \"region\":\"AA\"}, {\"prodId\":\"Prod2\", \"availability\":\"N\", \"region\":\"BB\"}] }";

你可以做:

ObjectMapper objectMapper = new ObjectMapper();

A a = objectMapper.readValue(aJson, A.class);
B b = objectMapper.readValue(bJson, B.class);

Map<String, ProductAvail> idToProductAvail = b.getProductAvail().stream()
        .collect(Collectors.toMap(ProductAvail::getProdId, Function.identity()));

List<Catalog> catalogs = a.getProducts().stream()
        .map(p -> {
            ProductAvail pa = idToProductAvail.get(p.getProdId());
            return new Catalog(pa.getProdId(), p.getColor(), p.getSize(),
    pa.getAvailability(), pa.getRegion());
        }).collect(Collectors.toList());

C c = new C(a.getId(), catalogs);

System.out.println(objectMapper.writeValueAsString(c));

输出:

{"id":"1","catalog":[{"prodId":"Prod1","color":"Red","size":"L","availability":"Y","region":"AA"},{"prodId":"Prod2","color":"Green","size":"L","availability":"N","region":"BB"}]}

推荐阅读