使用Java8谓词改进代码-比较多个参数
我不确定我有没有合适的头衔。我想对请求执行一些验证。我在现有代码的许多地方都有这个条件测试。它位于实用程序类中。该方法是DoesRequestLineFallsWithinTrange(对象) 我想知道我是否可以通过使用谓词来改进代码,使Java8更加优雅,并使该方法失效 处理请求: 我想检查每条线路是否符合条件。因此调用方法调用这个实用程序类来检查每一行是否在数据范围内。在本例中,是订阅期内的项目(requestLine) 当请求进入时,一些处理会将订阅成员对象添加到请求行。 然后在每一行上调用实用程序方法,检查请求行是否在订阅期内 该方法首先检查应该使用的日期字段是否不是null,以防止出现null异常 然后使用请求行日期与订阅成员的开始/结束日期字段进行比较,以确定日期是否在范围内 我想用Java8谓词函数调用替换该方法 下面是测试集合中每一行是否在数据范围内的方法示例使用Java8谓词改进代码-比较多个参数,java,java-8,functional-programming,predicate,Java,Java 8,Functional Programming,Predicate,我不确定我有没有合适的头衔。我想对请求执行一些验证。我在现有代码的许多地方都有这个条件测试。它位于实用程序类中。该方法是DoesRequestLineFallsWithinTrange(对象) 我想知道我是否可以通过使用谓词来改进代码,使Java8更加优雅,并使该方法失效 处理请求: 我想检查每条线路是否符合条件。因此调用方法调用这个实用程序类来检查每一行是否在数据范围内。在本例中,是订阅期内的项目(requestLine) 当请求进入时,一些处理会将订阅成员对象添加到请求行。 然后在每一行上调
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;
.....
}
public静态布尔doesRequestLineFallswithInDerange(RequestLine RequestLine){
if(isDatesNotNull(请求行)){
返回requestLine.getServiceStartDate().compareTo(requestLine.getSubscription().getStartDate())>=0
&&requestLine.getServiceStartDate().compareTo(requestLine.getSubscription().getEndDate())我尝试集成您的代码,以使用方法引用作为谓词并过滤请求行流。有趣的方法是execute
:它接收一个流,并使用对DoesRequestLineFallSwithinDerange方法的引用对其进行过滤
导入java.util.Date;
导入java.util.stream.stream;
公共类请求行{
公共void执行(流){
//这是有趣的代码
stream.filter(this::doesrequestlinefallswithinderage);
}
公共布尔值DoesRequestLineFallsWithinDerange(RequestLine RequestLine){
if(isDatesNotNull(请求行)){
返回requestLine.getServiceStartDate().compareTo(requestLine.getSubscription().getStartDate())>=0
&&requestLine.getServiceStartDate().compareTo(requestLine.getSubscription().getEndDate())下面是使用Java8谓词和本地日期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);
}
subscription.java
public class RequestLine
{
private Subscription subscription;
private LocalDate serviceStartDate;
// getters and setters
}
public class Subscription
{
private LocalDate startDate;
private LocalDate endDate;
// getters and setters
}
使用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);
谓词rlPred=this::isDatesNotNull;
rlPred=rlPred.and(p->p.getServiceStartDate().compareTo(p.getSubscription().getStartDate())>=0)
.和(p->p.getServiceStartDate().compareTo(p.getSubscription().getEndDate())您应该使该方法成为类RequestLine
的非静态无参数方法,即使其不仅仅是一个。您没有显示如何处理整个请求。您有RequestLine
的列表吗?请澄清