我不确定标题是否正确。我想对请求执行一些验证。我现有代码中的很多地方都有这个条件测试。它位于实用程序类中。该方法为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 8 Predicates
和LocalDate
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
}
我尝试集成您的代码,以使用方法引用作为谓词并过滤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;
}
使用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);