Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';这是在Java中组合两个对象数组的理想方法_Java_Arrays_Spring - Fatal编程技术网

什么';这是在Java中组合两个对象数组的理想方法

什么';这是在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

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 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中执行此操作,在解析源数据之后,您有两个选择

  • 确保您的源数据是按prodId为两个列表排序的,并且每个产品都有相应的ProductAvail。然后,您可以简单地假设第一个索引的索引在第二个索引的同一个索引中有一个有效条目,并使用单个循环遍历这两个条目

  • 更改源数据和类成员,以便使用prodId作为每个条目的键,将映射而不是列表作为输出。然后,您可以迭代产品映射中的键,并使用它们在单个循环中访问Product和ProductAvail映射

  • -

    如果您不能从(1)中做出保证或从(2)中做出更改,那么您将陷入
    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"}]}