按日期对对象列表进行排序并应用过滤器

时间:2019-01-11 22:27:53

标签: java sorting lambda java-8 comparator

我有付款清单:

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 等于 before 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 :(得分:6)

您的排序返回最早日期。您想要的是最新日期,该日期早于截止日期。

要查找流中的最小值或最大值,请不要使用sort(...).findFirst()。请改用maxmin。就您而言:

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

答案 1 :(得分:0)

问题出在过滤器中:

!it.getPaymentDueDate().isAfter(currentDueDate)

这允许付款到期日与当前到期日相同,但是您只希望过期付款。

将其更改为此:

it.getPaymentDueDate().isBefore(currentDueDate)