gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:48:57 26 4
gpt4 key购买 nike

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

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。为不同的 getter 一遍又一遍地编写相同的内容并不能让事情保持干燥。

有没有办法将 get.. 方法传递到构造函数中,以便它知道在下面的 for 循环中调用哪个方法?

提前致谢!

最佳答案

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

关于java - 如何使我的过滤模式更通用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54310136/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com