Java сравнивает два элемента объектов в списке - PullRequest
0 голосов
/ 26 октября 2018

Я конвертирую один объект в списке в другой объект, проходящий через них с помощью потоков.

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

Объект ответа имеет начальную и конечную дату для всех своих объектов, и я устанавливаю их для объекта Req.Теперь записи в объектах res могут иметь промежутки между начальной и конечной датой, и я хочу заполнить эти промежутки конечной датой последней записи и начальной / следующей / текущей записью.

Пример:

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 в поток, проверить текущий и следующий объекты списка и добавить дополнительные объекты в запрос.Не уверен, что это может быть достигнуто таким образом, или я должен использовать два для циклов.

1 Ответ

0 голосов
/ 26 октября 2018

С потоками это не так просто.Сначала вам нужно отсортировать ответы по 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());  
...