Улучшение кода с помощью Java 8 предикатов - сравнение нескольких аргументов - PullRequest
3 голосов
/ 14 января 2020

Я не уверен, что имею правильное название. Я хочу выполнить некоторую проверку по запросу. У меня есть этот условный тест во многих местах в моем существующем коде. Он находится в служебном классе. Метод IsRequestLineFallsWithinDateRange (object).

Мне интересно, могу ли я улучшить код и быть более элегантным с Java 8 с помощью предикатов и удалить метод.

Обработка запроса Я хочу проверить каждую строку, если они соответствуют условию. Таким образом, вызывающий метод вызывает этот служебный класс, чтобы проверить, находится ли каждая строка в диапазоне данных. В этом примере это элемент (requestLine) в течение периода подписки.

При поступлении запроса некоторая обработка добавляет объект-член подписки в строку запроса. Затем в каждой строке вызывается служебный метод, чтобы проверить, находится ли строка запроса в пределах периода подписки.

Метод сначала проверяет, что поля даты, которые он должен использовать, не являются пустыми, чтобы предотвратить пустое исключение.

Затем, используя дату строки запроса, сравнивает ее с полями даты начала / окончания подписки, чтобы определить, находятся ли даты в диапазоне.

Я хотел бы заменить метод на 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;
.....

}

Ответы [ 3 ]

2 голосов
/ 14 января 2020

Вот пример кода, написанного с использованием 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
}

Подсчет. java

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

    // getters and setters
}
1 голос
/ 14 января 2020

используйте 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);
1 голос
/ 14 января 2020

Я пытаюсь интегрировать ваш код, чтобы использовать ссылку на метод в качестве предиката и фильтровать поток RequestLine. Интересный метод - execute: он получает поток и фильтрует его со ссылкой на метод doesRequestLineFallsWithinDateRange.


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;

}
...