使用Java 8谓词改进代码-比较多个参数

问题描述 投票:3回答:3

我不确定标题是否正确。我想对请求执行一些验证。我现有代码中的很多地方都有这个条件测试。它位于实用程序类中。该方法为DidsRequestLineFallsWithinDateRange(object)。

我想知道我是否可以通过使用谓词并淘汰该方法来改进代码,并使Java 8更美观。

处理请求:我想检查每行是否满足条件。因此,调用方法将调用此实用工具类,以检查每行是否在数据范围内。在此示例中,是订阅期内的项目(requestLine)。

请求进入,某些处理将订阅成员对象添加到请求行。然后,在每行上调用实用程序方法,以检查请求行是否在订阅期内。

该方法首先检查应该使用的日期字段不为null,以防止出现null异常。

然后使用请求行日期,与订阅成员的开始/结束日期字段进行比较,以确定日期是否在范围内。

我想用Java 8谓词函数调用替换该方法。

这里是测试集合中每一行是否在数据范围内的方法的示例。

public static boolean DoesRequestLineFallsWithinDateRange(RequestLine requestLine) {
    if (isDatesNotNull(requestLine)) {
      return requestLine.getServiceStartDate().compareTo(requestLine.getSubscription().getStartDate()) >= 0
          && requestLine.getServiceStartDate().compareTo(requestLine.getSubscription().getEndDate()) <= 0;
    }
   return false;
  }

public class RequestLine(){
   private Date serviceStartDate;
   private Subscription subscription;
.....

}
java java-8 functional-programming predicate
3个回答
2
投票

这里是使用Java 8 PredicatesLocalDate API编写的示例代码

    public boolean doesRequestLineFallsWithinDateRange(RequestLine requestLine)
    {
        BiPredicate<LocalDate, LocalDate> afterDatePredicate = (startData, endDate) -> (startData.isAfter(endDate));
        BiPredicate<LocalDate, LocalDate> beforeDatePredicate = (startData, endDate) -> (startData.isBefore(endDate));

        if (Objects.isNull(requestLine))
        {
            return false;
        }

        LocalDate serviceStartDate = requestLine.getServiceStartDate();
        LocalDate startDate = requestLine.getSubscription().getStartDate();
        LocalDate endDate = requestLine.getSubscription().getEndDate();

        return afterDatePredicate.test(serviceStartDate, startDate) && beforeDatePredicate.test(serviceStartDate,
                endDate);

    }

参考Java代码

RequestLine.java

public class RequestLine

{
    private Subscription subscription;
    private LocalDate serviceStartDate;

    // getters and setters
}

Subscritpion.java

public class Subscription
{
    private LocalDate startDate;
    private LocalDate endDate;

    // getters and setters
}

1
投票

我尝试集成您的代码,以使用方法引用作为谓词并过滤RequestLine流。有趣的方法是execute:它接收流并参考dosRequestLineFallsWithinDateRange方法对其进行过滤。


import java.util.Date;
import java.util.stream.Stream;

public class RequestLine {

    public void execute(Stream<RequestLine> stream) {
        // this is the interesting code
        stream.filter(this::doesRequestLineFallsWithinDateRange);
    }

    public boolean doesRequestLineFallsWithinDateRange(RequestLine requestLine) {
        if (isDatesNotNull(requestLine)) {
            return requestLine.getServiceStartDate().compareTo(requestLine.getSubscription().getStartDate()) >= 0
                    && requestLine.getServiceStartDate().compareTo(requestLine.getSubscription().getEndDate()) <= 0;
        }
        return false;
    }

    //code created to complete the example
    public static class Subscription {

        private Date startDate;

        public Date getEndDate() {
            return endDate;
        }

        private Date endDate;

        public Date getStartDate() {
            return  startDate;
        }
    }



    private boolean isDatesNotNull(RequestLine requestLine) {
        return requestLine.serviceStartDate!=null;
    }


    public Date getServiceStartDate() {
        return serviceStartDate;
    }

    public Subscription getSubscription() {
        return subscription;
    }

    private Date serviceStartDate;
    private Subscription subscription;

}

1
投票

使用Predicate::and链接多个谓词

Predicate<RequestLine> rlPred = this::isDatesNotNull;

rlPred = rlPred.and(p -> p.getServiceStartDate().compareTo(p.getSubscription().getStartDate()) >= 0)
               .and(p -> p.getServiceStartDate().compareTo(p.getSubscription().getEndDate()) <= 0);
© www.soinside.com 2019 - 2024. All rights reserved.