Java 8 - Фильтр записи на основе даты и времени последней модификации из списка (который имеет повторяющиеся записи) - PullRequest
0 голосов
/ 29 января 2019

В моем приложении есть страница под названием история процессов, которая содержит множество процессов, которые можно дублировать.Используя фильтр Java 8 Steam (), я успешно отфильтрую процесс по имени файла и действию и получу результирующий список.Вы можете увидеть код и результат ниже.

Использование конструктора и установщика-получателя для добавления элемента в массив.

List<CurrentProcess> list = new ArrayList<>();
CurrentProcess addProcess = new CurrentProcess(strData1,strData2, strData3, date1 );
 list.add(addProcess);

// Конструктор

public CurrentProcess(String fileName, String action, String status, Date startDate) {
    super();
    FileName = fileName;
    Action = action;
    Status = status;
    StartDate = startDate;
}

List<CurrentProcess> filterList = list.stream().filter(x -> ("Transfer".equalsIgnoreCase(x.getAction())&& "ABC_File".equalsIgnoreCase(x.getFileName()))).collect(Collectors.toList());

Результат:

CurrentProcess [FileName=ABC_File, Action=Transfer, Status=Done, StartDate=Tue Jan 29 13:09:00 IST 2019]
CurrentProcess [FileName=ABC_File, Action=Transfer, Status=Done, StartDate=Tue Jan 29 13:09:00 IST 2019]
CurrentProcess [FileName=ABC_File, Action=Transfer, Status=Done, StartDate=Tue Jan 29 13:03:00 IST 2019]

Теперь я хочу получить запись на основе последней даты и времени из filterList с использованием фильтра Stream ().

Пожалуйста, помогите мне

Заранее спасибо

1 Ответ

0 голосов
/ 29 января 2019

Если вы хотите сохранить filterList, вы можете сделать это следующим образом:

LocalDate maxDate = filterList.stream()
                              .max(Comparator.comparing(CurrentProcess::getStartDate))
                              .get();

Если вы не используете filterList, вы можете сделать это непосредственно в трубопроводе:

LocalDate maxDate = list.stream()
                        .filter(Objects::nonNull)
                        .filter(x -> ("Transfer".equalsIgnoreCase(x.getAction())&& "ABC_File".equalsIgnoreCase(x.getFileName())))
                        .max(Comparator.comparing(CurrentProcess::getStartDate))
                        .get();

PS :

  • Не стесняйтесь менять тип maxDate.
  • Чтобы избежать NPE : выможете добавить .filter(Objects::nonNull) перед первым фильтром (, чтобы избежать слишком большой конкатенации тестовых примеров в одном методе фильтрации ) или использовать возвращаемый необязательный метод из max, а затем использовать его.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...