我有一个接口Calculate,它具有单个方法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数据的类,我可以使用任何Calculate接口实现将计算应用于该priceList。
问题:如果要同时将所有计算(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));