如何为具有不同属性的几个类调用筛选器和排序方法



情况:

我有一个固定的结构,某些组位于其中。添加新条目时,会在末尾插入该条目。数据库中设置的ID是连续的,但问题是它不在相应的组中。所以我不能按ID排序。每个条目总是得到一个或多个所谓的DB编号。使用它,我可以将新条目添加到特定的组中。我根据数据库编号的数字限制对条目进行排序。

其基本实体如下:

public class KEntity {
private Long kId;
private int kNumber;
private String kText;
private Integer db_8;
private Integer db_7;
private Integer db_6;
private Integer db_5;
private Integer db_4;
private Integer db_3;
private Integer db_2;
private Integer db_1;
getters & setters...
}

例如,如果添加了一个新条目,并且Db编号在10000到10070的范围内,则在这种情况下,它被分配到第一组,,我按如下方式求解

int from = 10000;
int to = 10070;
int sum = 1010000;
public List<KEntity> buildGroup(List<KEntity> kEntityList, int from, int to, int sum) {
return kEntityList.stream()
.filter(k -> k.getDb_1() != null && k.getDb_1() >= from && k.getDb_1() <= to || k.getDb_1() != null && k.getDb_1()
.equals(sum))
.sorted(Comparator.comparingInt(KagEntity::getDb_1))
.collect(Collectors.toList());
}

我调用此方法来根据数字边界对不同的组进行排序和创建。到目前为止,这个效果还不错。

在这种情况下,过滤和排序与属性DB_1有关。然而,系统中还有其他类不具有属性Db_1,例如,但只有Db_2或Db_3。

类似的东西,例如

public class FcEntity {
private Long fcId;
...
...
private int db2;
getters & setters...
}

如果我想把一个列表从FcEntity发送到buildGroup((方法,我逻辑上不能调用getDb_1((方法因为它不包括该方法。

我的目标是这样做,无论我使用什么类型的类,无论这个类有什么Db属性。使用buildGroup((方法。因此,我不必为每个类重写方法,也不必避免代码重复。

我不知道是否有可能。我想我可以用Java泛型来解决这个问题。但到目前为止,在仿制药领域,我几乎没有经验。或者,我应该或可以使用这种情况下的模式吗?

我希望这个问题可以理解,你可以帮忙。我愿意改进。

您可以让buildGroup接受Collection<? extends T>Function<? super T, Integer>,这样它就可以使用一个函数将集合元素映射为整数:

public <T> List<T> buildGroup(
Collection<? extends T> entities,
Function<? super T, Integer> property,
int from, int to, int sum
) {
return entities.stream()
.filter(elm -> isPropertyMatch(property.apply(elm), from, to, sum))
.sorted(Comparator.comparing(property))
.collect(Collectors.toList());
}

其中isPropertyMatch为:

private static boolean isPropertyMatch(Integer value, int from, int to, int sum) {
if(value == null) return false;
return value >= from && value <= to || value.equals(sum);
}

用例:

buildGroup(kEntityList, KEntity::getDb_1, from, to, sum);

最新更新