Применять вместе несколько реализаций или условий интерфейса

У меня есть интерфейс Calculate, который имеет единственный метод вычисления (List priceList) public interface Calculate { public List<Double> calculate(List<Double> priceList); }

Каждая реализация этого интерфейса будет выполнять некоторые вычисления и проверять некоторые условия для значений priceList, и если условие удовлетворяет этому значению цены, то в качестве выходных данных он будет возвращать список удовлетворяющих значений из priceList.

Пример.

`public class CalculateImpl1 implements Calculate { 
       @Override
       public List<Double> calculate(List<Double> priceList) { 
        List<Double> result = new AL();
        loop the priceList
       if (condition1 satisfies on priceList value) { 
         result.add(value); 
       } 
      return result;
    } 
  }

  public class CalculateImpl2 implements Calculate { 
       @Override
       public List<Double> calculate(List<Double> priceList) { 
        List<Double> result = new AL();
        loop the priceList
       if (condition2 satisfies on priceList value) { 
         result.add(value); 
       } 
      return result;
    } 
  }`

Допустим, есть класс, у которого есть данные priceList, и я могу применить расчет к этому priceList, используя любую реализацию интерфейса Calculate.

Вопрос: Как добиться, если я хочу применить все вычисления (CalculateImp1 / condition1, CalculateImpl2 / condition2 ....) к priceList одновременно, это означает, что priceList должен удовлетворять всем условиям и получать результат?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
25
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот для чего использовался предикат:

public class CalculateImpl implements Calculate { 
     @Override
     public List<Double> calculate(List<Double> priceList, Predicate<Double> filter) { 
         priceList.stream().filter(filter).collect(Collectors.toList());
    } 
}

Тогда используйте это:

Calculate calc = new CalculateImpl();
Predicate<Double> pre1 = d -> {condition1}; 
// Eg: Predicate<Double> pre1 = d -> d > 100; (filter price whose values greater than 100)
List<Double> list1 = calc.calculate(priceLIst, pre1);

Чтобы объединить условия:

Predicate<Double> pre2 = d -> {condition2};
List<Double> list2 = calc.calculate(priceList, pre1.and(pre2));

Чтобы использовать условие or:

Predicate<Double> pre2 = d -> {condition2};
List<Double> list2 = calc.calculate(priceList, pre1.or(pre2));

Другие вопросы по теме