【问题标题】:Java compare two elements of objects in a listJava比较列表中对象的两个元素
【发布时间】:2018-10-26 16:03:32
【问题描述】:

我正在将列表中的一个对象转换为另一个使用流循环遍历它们的对象。

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

响应对象的所有对象都有 startdate 和 enddate,我将它们设置为 Req 对象。现在 res 对象中的记录可能在 startdate 和 enddate 之间存在间隙,我想用最后一条记录的 enddate 和下一条/当前记录的 startdate 来填补这些空白。

例如:

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

那么我的 Req 对象应该有如下记录

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

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

【问题讨论】:

  • 将数据清洗与映射分离。

标签: java arraylist java-8 java-stream


【解决方案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());  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    • 2019-12-07
    • 2020-07-04
    • 1970-01-01
    • 2015-11-06
    相关资源
    最近更新 更多