gpt4 book ai didi

java - 在 Java 中动态链接比较器

转载 作者:行者123 更新时间:2023-12-05 05:42:26 28 4
gpt4 key购买 nike

我希望能够根据可以传递给方法的元素的各种可选属性对列表进行动态排序。

例如,假设我有一个 Person 类:

interface Person {
String getName();
int getAge();
LocalDate getBirthDate();
}

如果我希望能够先按姓名排序,然后再按年龄排序,我通常会这样做:

Collections.sort(unsortedPersons, Comparator.comparing(Person::getFirstName).thenComparing(Person::getAge))

但是如果我想动态选择这些属性怎么办?如何正确地实现这一点?我希望能够签订类似于以下内容的契约(Contract):

List<Person> sortedPersons = sortPersons(
List.of(person1, person2, person3),
List.of(Person::getName, Person::getAge)
);

其中第一个参数是未排序的人员列表,第二个参数是将动态创建上述比较器链的函数列表。

我遇到的问题是下面的方法引用无法解析,可能是因为函数列表可以返回不同的类型。

public static List<Person> sortPersons(List<Person> unsortedPersons, List<Function<Person, ?>> sortableproperties) {
var comparator = sortableproperties.stream()
.map(Comparator::comparing)
.reduce(Comparator::thenComparing)
.orElse(Comparator.naturalOrder());
return unsortedPersons.stream()
.sorted(comparator)
.collect(Collectors.toList());

}

有没有更优雅的方式来实现这一点?

最佳答案

主要问题是方法sortPersons参数List<Function<Person, ?>>调用 Comparator.comparing 时哪个编译器无法识别.不幸的是,这个问题不能通过替换 ? 来解决。至 Comparable<?> .所以我们能做的最好的就是转换 FunctionComparator<Person>首先。

如果我们只有类似的东西,听起来可能有点无聊

private static <T extends Comparable<T>> Comparator<Person> convertToComparator(Function<Person, T> properties) {
return Comparator.comparing(properties);
}

但是我们需要将排序切换为升序/降序是很常见的,所以我们可以在下面写。

private static <T extends Comparable<T>> Comparator<Person> asc(Function<Person, T> properties) {
return Comparator.comparing(properties);
}

private static <T extends Comparable<T>> Comparator<Person> desc(Function<Person, T> properties) {
return Comparator.comparing(properties).reversed();
}

那么我们可以这样做。

List<Person> sortedPersons = sortPersons(
List.of(person1, person2, person3),
List.of(asc(Person::getName), desc(Person::getAge))
);

关于java - 在 Java 中动态链接比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72037377/

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