按日期排序对象列表并应用过滤器
Sort List of objects by date and applying filter
我有付款清单:
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;
}
当我传入 "2018-06-01"
的 currentDueDate
时,我希望我的代码为 return Payment 1
。
目前正在 returning Payment 2
。
如果我从我的测试中删除 Payment 2
,那么它 returns Payment 1
.
所以排序一定有问题。
过滤器有问题:
!it.getPaymentDueDate().isAfter(currentDueDate)
这允许付款到期日与当前到期日相同,但您只需要逾期次付款。
改成这样:
it.getPaymentDueDate().isBefore(currentDueDate)
您的排序 returns 最早 日期。您想要的是早于截止日期的 latest 日期。
要查找流中的最小值或最大值,请不要使用 sort(...).findFirst()
。请改用 max
or 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
我有付款清单:
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;
}
当我传入 "2018-06-01"
的 currentDueDate
时,我希望我的代码为 return Payment 1
。
目前正在 returning Payment 2
。
如果我从我的测试中删除 Payment 2
,那么它 returns Payment 1
.
所以排序一定有问题。
过滤器有问题:
!it.getPaymentDueDate().isAfter(currentDueDate)
这允许付款到期日与当前到期日相同,但您只需要逾期次付款。
改成这样:
it.getPaymentDueDate().isBefore(currentDueDate)
您的排序 returns 最早 日期。您想要的是早于截止日期的 latest 日期。
要查找流中的最小值或最大值,请不要使用 sort(...).findFirst()
。请改用 max
or 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