使用自定义对象的另一个ArrayList字段对ArrayList进行排序

时间:2019-03-04 16:42:31

标签: java sorting arraylist java-8

我有2个数组列表,一个自定义对象的RequestList和ResponseList。 该请求列表具有10个带有RequestHeader和RequestBody的肥皂请求。 10是一个示例(甚至可以是1000条甚至更多甚至一百万条记录) 现在,RequestHeader(Header.java)具有一个名为RequestId的元素,类型为String

请求对象

<CustomClassRequest>
 <header>
    <RequestId>1</RequestId>
 </header>
 <Body></Body>
</CustomClassRequest>

假设RequestList有10个soap请求,且requestId从1到10 (使用数字简化此用例)

现在,我并行触发这些肥皂请求并松开插入顺序 当我收到请求清单中的回复时。 因此,我的ResponseList将包含所有这10个肥皂请求的响应 但以requestId的顺序不同。

响应对象

<CustomClassResponse>
 <header>
    <RequestId>1</RequestId>
 </header>
 <Body></Body>
</CustomClassResponse>

注意:Response中的头是另一个类ResponseHeader.java

我可以使用公用字段RequestId对我的ResponseList进行排序吗 根据插入顺序确定RequestList的存在方式。

让我知道Java 8 API是否有可能的解决方案,甚至使用任何第三方解决方案

2 个答案:

答案 0 :(得分:0)

您可以使用java8 lambda表达式

例如

resposneList.stream()
   .sorted((o1, o2) -> o1.getHeader().getRequestId()
   .compareTo(o2.getHeader().getRequestId()))`

答案 1 :(得分:0)

您不应该使用比较器,因为您不比较它们之间的列表元素来计算其顺序。
您可以从响应列表创建一个将ID与响应相关联的Map。
然后流式传输请求并将其ID映射到map键。
这是为响应创建新列表的解决方案:

Map<Integer, Response> responseByIdMap = responses.stream()
                                                  .collect(toMap(Response::getId, r->r);

responses = 
request.stream()
       .map( req -> responseByIdMap.get(req.getId))
       .collect(toList());