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

时间:2019-01-22 14:11:04

标签: java

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

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...方法创建相同的东西(它们也返回整数)。例如,我有getxLgetxR。一遍又一遍地为不同的吸气剂写同样的东西并不能使事情保持干燥。

是否有任何方法可以将get..方法传递给构造函数,以便它知道在下面的for循环中调用哪个方法?

谢谢!

1 个答案:

答案 0 :(得分:1)

是的,有一种方法可以使用方法引用。语法例如为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);