代码之家  ›  专栏  ›  技术社区  ›  Sam

如何使我的过滤模式更通用

  •  1
  • Sam  · 技术社区  · 6 年前

    我已经编写了一些使用过滤器设计模式的代码,如下所示:

    public class SingleLengthCriteria implements XsamCriteria {
    
    private final FilterLength filterLength;
    
    public SingleLengthCriteria(FilterLength filterLength)  {
      this.filterLength = filterLength;
    }
    
    @Override
    public List<XsamRecord> meetRecordCriteria(List<XsamRecord> records) {
      List<XsamRecord> spanLengthRecords = new ArrayList<>();
    
      for(XsamRecord record : records){
        if(record.getXs() >= filterLength.getMin() && record.getXs() <= filterLength.getMax()){
        spanLengthRecords.add(record);
        }
      }
    
      return spanLengthRecords;
    }
    

    这个 FilterLength 只是一个有最小和最大坐标的POJO。

    这个 XsamRecord 正在筛选的对象。在这个例子中,我过滤了 XsamRecords getXs 方法,它简单地返回一个整数。

    这一切都很好,但我也希望为其他人创造同样的东西 getx... 方法(它们也返回整数)。例如,我有 getxL , getxR . 为不同的吸气剂一遍又一遍地写同样的东西并不能完全保持干燥。

    有没有办法通过 get.. 方法,以便它知道在 for 下面循环?

    事先谢谢!

    1 回复  |  直到 6 年前
        1
  •  1
  •   Giacomo Alzetta    6 年前

    是的,有一种方法,使用方法引用。例如,语法是, XsamRecord::getXs .

    关联参数的类型将为 Function<XsamRecord, Integer> .

    public class SingleLengthCriteria implements XsamCriteria {
    
    private final FilterLength filterLength;
    private final Function<XsamRecord, Interger> propertyValueGetter;
    
    public SingleLengthCriteria(FilterLength filterLength, Function<XsamRecord, Interger> propertyValueGetter)  {
      this.filterLength = filterLength;
      this.propertyValueGetter = propertyValueGetter;
    }
    
    @Override
    public List<XsamRecord> meetRecordCriteria(List<XsamRecord> records) {
      List<XsamRecord> spanLengthRecords = new ArrayList<>();
    
      for(XsamRecord record : records){
        final Integer value = propertyValueGetter.apply(record);
        if(value >= filterLength.getMin() && value <= filterLength.getMax()){
        spanLengthRecords.add(record);
        }
      }
    
      return spanLengthRecords;
    }
    

    用作:

    new SingleLengthCriteria(..., XsamRecord::getXs);
    new SingleLengthCriteria(..., XsamRecord::getOtherProperty);