Сортировка списка объектов по дате и применению фильтра - PullRequest
0 голосов
/ 12 января 2019

У меня есть список платежей:

Payment 1
  CountyTaxAmount = 250.00
  CityTaxAmount   = 101.00
  LienAmount      = 0.00
  HazardAmount    = 0.00
  PaymentDueDate  = "2018-06-01"

Payment 2
  CountyTaxAmount = 10.00
  CityTaxAmount = 20.00
  LienAmount      = 0.00
  HazardAmount    = 0.00
  PaymentDueDate = "2018-05-01"

Я создал функцию, которая берет в этом списке currentDueDate. Если paymentDueDate равно равно или до currentDueDate и ближайшему к currentDueDate, я хочу использовать эту строку в моих вычислениях.

Почему-то мой вид не работает должным образом. Может кто-нибудь пролить свет на то, что я делаю не так. Вот мой код:

private EscrowStatusEnum determineEscrowStatus(Payment pcm, LocalDate currentDueDate) {
    EscrowStatusEnum escrowStatus = null;

    if(currentDueDate!= null && pcm!=null 
            && pcm.getPayment() != null 
            && !pcm.getPayment().isEmpty()) {

        Predicate<Payment> pcmRow = 
                it->it.getPaymentDueDate()!=null && !it.getPaymentDueDate().isAfter(currentDueDate);

        final Payment sortedRow = 
                pcm.getPayment().stream().sorted((el1, el2) -> el1.getPaymentDueDate().compareTo(el2.getPaymentDueDate())).
                filter(pcmRow).findFirst().orElse(null);

        if(sortedRow != null) {

            BigDecimal countyCityLienHazardSum = sortedRow.getCountyTaxAmount().add(sortedRow.getCityTaxAmount()).add(sortedRow.getLienAmount()).add(sortedRow.getHazardAmount());
            BigDecimal countyCityLienSum = sortedRow.getCountyTaxAmount().add(sortedRow.getCityTaxAmount()).add(sortedRow.getLienAmount());

            if(countyCityLienHazardSum.compareTo(BigDecimal.ZERO) == 0)
                escrowStatus = EscrowStatusEnum.NONESCROWED;
            else if(countyCityLienSum.compareTo(BigDecimal.ZERO) > 0 && sortedRow.getHazardAmount().compareTo(BigDecimal.ZERO) == 0 ||
                    countyCityLienSum.compareTo(BigDecimal.ZERO) >= 0 && sortedRow.getHazardAmount().compareTo(BigDecimal.ZERO) > 0)
                escrowStatus = EscrowStatusEnum.ESCROWED;
        }
    }

    return escrowStatus;
}

Когда я передаю currentDueDate из "2018-06-01", я хочу, чтобы мой код возвращал Payment 1.

В настоящее время возвращается Payment 2.

Если я удаляю Payment 2 из моих тестов, он возвращает Payment 1.

Так что с сортировкой что-то не так.

Ответы [ 2 ]

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

Ваш тип возвращает самую раннюю дату. То, что вы хотите, это последняя дата, которая является более ранней, чем отсечение.

Чтобы найти наименьшее или наибольшее значение в потоке, не используйте sort(...).findFirst(). Используйте взамен max или min. В вашем случае:

sortedRow = pcm.getPayment().stream()
               .filter(pcmRow)
               .max(Comparator.comparing(Payment::getPaymentDueDate))
               .orElse(null);   // not relevant to your question but consider not using nulls so much
0 голосов
/ 12 января 2019

Проблема в фильтре:

!it.getPaymentDueDate().isAfter(currentDueDate)

Это позволяет датой платежа быть равной тому же , что и текущая дата платежа, но вы хотите только просроченные платежи.

Измените это на:

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