Ordenar lista de objetos según la fecha y la aplicación de filtro

Angelina:

Tengo lista de pagos:

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"

He creado una función que toma en esta lista y currentDueDate. Si paymentDueDatees iguales a , o antes currentDueDate , y uno que es más cercano a currentDueDate, quiero usar esa fila en mis cálculos.

Por alguna razón mi especie no está funcionando adecuadamente. ¿Alguien puede arrojar algo de luz sobre lo que estoy haciendo mal. Aquí está mi código:

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;
}

Cuando paso en currentDueDatede "2018-06-01", quiero que mi código de retorno Payment 1.

Actualmente se está volviendo Payment 2.

Si quito Payment 2de mis pruebas, y luego vuelve Payment 1.

Así que algo debe estar mal con el tipo.

Misha:

Su ordenación devuelva el primer día. Lo que se quiere es la última fecha que es anterior a la de corte.

Para encontrar el valor más pequeño o más grande en una corriente, no utilice sort(...).findFirst(). Utilizar maxo minlugar. En tu caso:

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

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=178650&siteId=1
Recomendado
Clasificación