使用 getter 方法引用的映射创建比较器

Create Comparator using map of getter method references

我尝试使用 Comparator.compare 基于具有非空值的对象字段创建比较器,然后将其与 Comparator.thenCompare 链接起来。我有一个 HashMap,它将字段存储为键,将 getter 方法引用存储为值。

这是我的字段枚举:

 public enum BikeProperty {
     BRAND,
     MAX_SPEED,
     WEIGHT,
     SIZE_OF_WHEEL,
     NUMBER_OF_GEARS,
     IS_LIGHT_AVAILABLE,
     BATTERY_CAPACITY,
     COLOR,
     PRICE
}

每个字段都与 Bike 对象中的某个字段相关。

下一站是我的 HashMap,如下所示:

    Map<BikeProperty, Function<Bike, Comparable<?>>> fieldToFieldExtractor = new HashMap<>();
    fieldToFieldExtractor.put(BikeProperty.MAX_SPEED, Bike::getMaxSpeed);
    fieldToFieldExtractor.put(BikeProperty.WEIGHT, Bike::getWeight);
    fieldToFieldExtractor.put(BikeProperty.SIZE_OF_WHEEL, Bike::getSizeOfWheels);
    fieldToFieldExtractor.put(BikeProperty.NUMBER_OF_GEARS, Bike::getNumberOfGears);
    fieldToFieldExtractor.put(BikeProperty.IS_LIGHT_AVAILABLE, Bike::isLightsAvailable);
    fieldToFieldExtractor.put(BikeProperty.BATTERY_CAPACITY, Bike::getBatteryCapacity);
    fieldToFieldExtractor.put(BikeProperty.COLOR, Bike::getColor);
    fieldToFieldExtractor.put(BikeProperty.PRICE, Bike::getPrice);

最后是我的方法:

public Comparator<Bike> provideComparatorByFields(Set<BikeProperty> fields) {
    Comparator<Bike> comparator = Comparator.comparing(Bike::getBrand);
    fields
            .forEach(s -> comparator.thenComparing(fieldToFieldExtractor.get(s)));
    return comparator;
}

我的想法是传递给已过滤的方法 Set<BikePropery>,遍历此方法并链接比较器方法。

例如,对于给定的集合 Set.of(BikeProperty.PRICE,BikeProperty.IS_LIGHT_AVAILABLE),生成以下比较器:Comparator.compare(Bike::getBrand).thenCompare(Bike::getPrice).thenCompare(Bike::isLightAvailable)

问题: 创建的比较器只有一个默认比较器Bike::getBrand()。因此,我有一个问题,是否可以这样做,如果可能的话,请提出一些建议。谢谢!

更新

当我从我的主要方法创建比较器(例如)时,它看起来像这样:

但是当我通过 forEach 循环在我的方法中创建它时,它看起来像这样:

因此它不会将任何 thenComparing() keyExtractor 附加到比较器

您没有存储更改。 thenCompare 不修改原来的比较器,而是 returns 一个新的比较器。

for (var s : fields) {
    comparator = comparator.thenComparing(fieldToFieldExtractor.get(s)));
}