使用 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)));
}
我尝试使用 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)));
}