Java比较列表中对象的两个元素

时间:2018-10-26 16:03:33

标签: java arraylist java-8 java-stream

我正在将列表中的一个对象转换为另一对象,并通过流对其进行循环。

FOR CHANNEL 'master-1'

响应对象的所有对象都有开始日期和结束日期,我将它们设置为Req对象。现在res对象中的记录可能在开始日期和结束日期之间存在间隙,我想用上一个记录的结束日期和下一个/当前记录的开始日期来填充这些间隙。

例如:

    response.stream().map(res -> new Req(res.getId(), 
res.getStartDate(), res.getEndDate())).collect(Collectors.toList());

然后我的Req对象应该具有以下记录

startdate    enddate
 ---------   ---------
 01-01-2018  01-05-2018
 01-05-2018  01-09-2018
 01-12-2018  01-14-2018
 01-20-2018  01-25-2018

我想在流中添加一个if条件,并检查列表的当前和下一个对象,并在请求中添加其他对象。不确定是否可以通过这种方式实现,否则我必须使用两个for循环。

1 个答案:

答案 0 :(得分:1)

使用流并不是那么容易。首先,您需要按startDate对响应进行排序:

List<Response> sorted = responses.stream()
         .sorted(Comparator.comparing(Response::getStartDate))
         .collect(Collectors.toList()); 

比创建一个将从Response转换为Request的方法:

private static Request fromResponse(Response response) {
    return new Request(response.getStartDate(), response.getEndDate(), response.getId());
} 

最后进行流操作:

List<Request> req = IntStream.range(0, sorted.size())
                                 .boxed()
                                 .flatMap(x -> {
                                     if (x == responses.size() - 1) {
                                         return Stream.of(fromResponse(responses.get(x)));
                                     }
                                     Response left = responses.get(x);
                                     Response right = responses.get(x + 1);

                                     if (!left.getEndDate().equals(right.getStartDate())) {
                                         Response oneMore = new Response(
                                             left.getEndDate(),
                                             right.getStartDate(),
                                             left.getId());
                                         return Stream.of(fromResponse(left), fromResponse(oneMore));
                                     } else {
                                         return Stream.of(fromResponse(left));
                                     }
                                 })
                                 .collect(Collectors.toList());