Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java8谓词改进代码-比较多个参数_Java_Java 8_Functional Programming_Predicate - Fatal编程技术网

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

使用Java8谓词改进代码-比较多个参数,java,java-8,functional-programming,predicate,Java,Java 8,Functional Programming,Predicate,我不确定我有没有合适的头衔。我想对请求执行一些验证。我在现有代码的许多地方都有这个条件测试。它位于实用程序类中。该方法是DoesRequestLineFallsWithinTrange(对象) 我想知道我是否可以通过使用谓词来改进代码,使Java8更加优雅,并使该方法失效 处理请求: 我想检查每条线路是否符合条件。因此调用方法调用这个实用程序类来检查每一行是否在数据范围内。在本例中,是订阅期内的项目(requestLine) 当请求进入时,一些处理会将订阅成员对象添加到请求行。 然后在每一行上调

我不确定我有没有合适的头衔。我想对请求执行一些验证。我在现有代码的许多地方都有这个条件测试。它位于实用程序类中。该方法是DoesRequestLineFallsWithinTrange(对象)

我想知道我是否可以通过使用谓词来改进代码,使Java8更加优雅,并使该方法失效

处理请求: 我想检查每条线路是否符合条件。因此调用方法调用这个实用程序类来检查每一行是否在数据范围内。在本例中,是订阅期内的项目(requestLine)

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

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

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

我想用Java8谓词函数调用替换该方法

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

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
的列表吗?请澄清