Применить в целом несколько реализаций или условие интерфейса - PullRequest
0 голосов
/ 09 июня 2018

У меня есть интерфейс Calculate, в котором есть один метод расчета (List priceList) public interface Calculate { public List<Double> calculate(List<Double> 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 должен удовлетворять всем условиям и получить вывод?

1 Ответ

0 голосов
/ 09 июня 2018

Для этого используется предикат:

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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...