我有一个接口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));

08-26 07:44