什么';这是在Java中组合两个对象数组的理想方法
A类:什么';这是在Java中组合两个对象数组的理想方法,java,arrays,spring,Java,Arrays,Spring,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; } B类: public class B{ private String
public class A{
private String Id;
private List<Product> products = new ArrayList<>();
}
public class Product{
private String prodId;
private String color;
private String size;
}
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;
}
我想把它们合并成一个
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"}] }
公共C类{
私有字符串Id;
私有列表目录=新的ArrayList();
}
公共类目录{
私有字符串prodId;
私有字符串颜色;
私有字符串大小;
私有字符串可用性;
私有字符串区域;
}
C={“Id”:1,目录:[{“prodId”:“Prod1”,“color”:“Red”,“size”:“L”,“availability”:“Y”,“region”:“AA”},
{“prodId”:“Prod2”,“color”:“Green”,“size”:“L”,“availability”:“N”,“region”:“BB”}]}
在Java中,不使用两个for循环的理想方法是什么
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));
假设您想在Java中执行此操作,在解析源数据之后,您有两个选择
foreach产品{foreach productavail{…}}
的最坏情况,因为您必须为每个产品找到正确的productavail
您可以采取措施,通过为发现的内部列表成员设置空值并跳过空值,或者通过使用parallelStream在不同的线程上为每个外部迭代抛出内部循环来减轻影响,但此时没有任何操作可以避免在
循环{loop{}
上需要一些riff,这是一个最佳情况。@hovercraftfullofels我已经解析了它,想要合并成一个,请参见上面的示例在这个问题中包含JSON对我来说似乎是偶然的;作者要求快速运行java中的两个对象列表,而不是在读取时与Jackson交错源数据。@RG Rawlings由于作者提供了JSON,我认为最好涵盖这两种情况并提供完整详细的解决方案。我看不出我在哪里做到了——“在读取时交错源数据”。我分析了对象。问题标题和作者的评论说他们想处理A和B,而不是之前的数据。你的答案是真实的,但他们的问题有家庭作业的味道p@RG-罗林斯在这种情况下,你可以跳过这一部分,从“地图”中阅读
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"}]}