Удаление из списка со сравнением даты - PullRequest
0 голосов
/ 20 февраля 2019

Я должен удалить все объекты до param.getFromDateTime и после params.getToDateTime.Я сделал это так:

for (ListIterator<Doc> iterator = doc.listIterator(); iterator.hasNext(); ) {
    while(iterator.hasNext()){
            if(param.getFromDateTime() != null
              && doc.get(iterator.nextIndex()).getDate().before(params.getFromTime())) {
                iterator.remove();
            }
            if(params.getToDateTime() != null
              && doc.get(iterator.nextIndex()).getDate().after(params.getToDateTime())) {
                iterator.remove();
           }
    }
}

Могу ли я сделать это лучше и понятнее?

Ответы [ 3 ]

0 голосов
/ 20 февраля 2019

Пример java-8 с потоковым API:

List<Doc> docs = ...;
Stream<Doc> stream = docs.stream();
LocalDateTime fromDateTime = param.getFromDateTime();
LocalDateTime toDateTime = param.getToDateTime();
if (fromDateTime != null){
    stream = stream.filter(d -> !d.getDate().before(fromDateTime);
}
if (toDateTime != null){
    stream = stream.filter(d -> !d.getDate().after(toDateTime);
}
docs = stream.collect(Collectors.toList());
0 голосов
/ 20 февраля 2019

Возможно, вы захотите использовать List.removeIf, если вы используете Java 8:

List<Doc> docs = generateSomeValues(); // this ist just an imaginary filling of the list
// check if the params are not null and remove dates that are not in the given interval
docs.removeIf(doc ->
    (params.getFromTime() != null && doc.getDate().before(params.getFromTime()))
    || (params.getToDateTime() != null && doc.getDate().after(params.getToDateTime()))
);
0 голосов
/ 20 февраля 2019

Вам не нужны два цикла и вам также не нужно ListIterator.
Обратите внимание, что эти два условия могут быть верными, но вы хотите удалить только один элемент в любом случае, потому что вызов дважды remove() будетВозбудите исключение.
Вы также можете напрямую извлечь date из повторного объекта Doc, чтобы сделать его еще более понятным:

for (Iterator<Doc> iterator = doc.iterator(); iterator.hasNext(); ) {
      Date date = iterator.next().getDate();

      if( (param.getFromDateTime() != null && date.before(params.getFromTime())) 
          || (params.getToDateTime() != null && date.after(params.getToDateTime()))) {
        iterator.remove();
      }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...