Java 实现可配置的排序标准
我需要能够根据多个条件对对象进行排序,并且这些排序需要可以从application.properties文件进行配置(因为应该可以在文件中指定要应用的排序和顺序) 因此,在我的设计中,我为每种类型创建了一个比较器,然后与供应商创建了一个枚举,例如:Java 实现可配置的排序标准,java,oop,design-patterns,Java,Oop,Design Patterns,我需要能够根据多个条件对对象进行排序,并且这些排序需要可以从application.properties文件进行配置(因为应该可以在文件中指定要应用的排序和顺序) 因此,在我的设计中,我为每种类型创建了一个比较器,然后与供应商创建了一个枚举,例如: public enum CarSort { ENGINE(CarEngineComparator::new), BRAND(CarBrandComparator::new); private final Supplier<Co
public enum CarSort {
ENGINE(CarEngineComparator::new), BRAND(CarBrandComparator::new);
private final Supplier<Comparator<Car>> constructor;
CarSort(Supplier<Comparator<Car>> constructor){
this.constructor = constructor;
}
Comparator<Car> newComparator() {
return constructor.get();
}
}
并用以下内容链接分类:
Stream<Comparator<Car>> comparators = sorts.stream().map(CarSort::newComparator);
return comparators
.reduce(Comparator::thenComparing)
.map(comparator -> filteredCars.sorted((comparator.reversed())))
.orElse(filteredCars)
.collect(Collectors.toList());
streamcomparators=sorts.Stream().map(CarSort::newComparator);
返回比较器
.reduce(比较器::然后比较)
.map(comparator->filteredCars.sorted((comparator.reversed()))
.orElse(过滤卡)
.collect(Collectors.toList());
我现在的问题是,其中一个比较器需要两个参数,所以我认为这个解决方案不再适用,但我现在想不出任何干净的替代方案
您是否知道是否有可能调整我当前的设计以满足此要求,或者是否有其他可行的解决方案
我将添加更多细节。比如说,我需要添加一个特定的比较器来对汽车进行分类,例如根据汽车与客户的距离。所以它可能是这样的(细节其实并不重要,只是它需要一个额外的参数):
公共类CardStanceComparator实现Comparator{
私人位置来源;
心脏比较器(位置原点){
this.origin=origin;
}
@凌驾
公共整数比较(o1车、o2车){
double distanceToFirstCar=DistanceService.CalculatedInstance(origin,o1.getLocation());
double distanceToSecondCar=DistanceService.calculateDistance(origin,o2.getLocation());
返回Double.compare(distanceToFirstCar,distanceToSecondCar);
}
}
因此,我希望能够为多个客户按品牌、引擎、距离(在配置文件中指定)进行排序。这意味着每次我都需要将不同的参数传递给DistanceComparator。是否使用方法引用是这里的问题?(如
CarEngineComparator::new
)?嗯,我不确定,可能是,但我没有看到它,如果没有方法引用,它会是什么样子?我的意思是,我在哪里或如何将参数传递给CarBrandComparator,例如?引擎(()->new CarEngineComparator(..)
Hmm,但我认为这不起作用,因为这些参数不是静态的,它们根据我检索比较器的时间/地点而不同。请编辑您的问题,添加更多详细信息。如果不了解这些,我们就无法提供有效的答案
Stream<Comparator<Car>> comparators = sorts.stream().map(CarSort::newComparator);
return comparators
.reduce(Comparator::thenComparing)
.map(comparator -> filteredCars.sorted((comparator.reversed())))
.orElse(filteredCars)
.collect(Collectors.toList());
public class CarDistanceComparator implements Comparator<Car> {
private Location origin;
CarDistanceComparator(Location origin) {
this.origin = origin;
}
@Override
public int compare(Car o1, Car o2) {
double distanceToFirstCar = DistanceService.calculateDistance(origin, o1.getLocation());
double distanceToSecondCar = DistanceService.calculateDistance(origin, o2.getLocation());
return Double.compare(distanceToFirstCar, distanceToSecondCar);
}
}