java - 在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 中执行此操作的理想方法是什么?
解决方案
鉴于:
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"}]}
推荐阅读
- python - 如何在 Python 中以正确的顺序将抓取的数据写入数据帧
- sql-server - 在兼容模式 2008 上运行的 SQL Server 2016
- python - 通过 ORM 删除多个 Django 对象
- python - 如何使用 scipy.Delaunay 避免四面体躺在飞机上?
- mathnet-numerics - 为什么 MathNet Point3D 组件是只读的?
- xquery - 如何替换marklogic中特定元素的属性文本
- java - spring boot jar和intellij idea中错误处理的不同行为
- etl - 使用任何 ETL 工具进行数据转换的可行性分析
- python - 在两个 DataFrame 中查找对应的值
- angular - 角度笑话,测试效果抛出未处理的错误