У меня есть интерфейс 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 должен удовлетворять всем условиям и получать результат?




Вот для чего использовался предикат:
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));