gpt4 book ai didi

intellij-idea - 用 Java 8 的 Comparator.comparing(...).thenComparing(...) 替换 CompareToBuilder

转载 作者:行者123 更新时间:2023-12-04 06:33:38 24 4
gpt4 key购买 nike

在 Java 8 之前,我们实现了 Comparable.compareTo(...)像这样:

public int compare(Person a, Person b) {
return new CompareToBuilder()
.append(a.getLastName(), b.getLastName())
.append(a.getFirstName(), b.getFirstName())
.toComparison();
}

从 Java 8 开始,我们可以这样做:
public int compare(Person a, Person b) {
return Comparator
.comparing(Person::getLastName)
.thenComparing(Person::getFirstName)
.compare(a, b);
}

新的 Java 8 方式可能允许我们放弃 commons-lang3依赖性。 那个新的 Java 8 会更快吗?有没有办法自动迁移? 我没有找到它的 IntelliJ 意图。

请注意,当存在反向顺序并且涉及非自然比较时,它会变得更加复杂:
public int compare(SingleBenchmarkResult a, SingleBenchmarkResult b) {
return new CompareToBuilder()
.append(b.hasAnyFailure(), a.hasAnyFailure()) // Reverse
.append(a.getAverageScore(), b.getAverageScore(), resilientScoreComparator)
.toComparison();
}

变成
public int compare(SingleBenchmarkResult a, SingleBenchmarkResult b) {
return Comparator
.comparing(SingleBenchmarkResult::hasAnyFailure, Comparator.reverseOrder()) // Reverse
.thenComparing(SingleBenchmarkResult::getAverageScore, resilientScoreComparator)
.compare(a, b);
}

最佳答案

如果你这样写

public int compare(Person a, Person b) {
return Comparator
.comparing(Person::getLastName)
.thenComparing(Person::getFirstName)
.compare(a, b);
}

您正在通过构建新的 Comparator 来浪费性能对于每次比较。在查看周围的代码时,它显然应该是荒谬的。 compare(Person a, Person b)方法肯定是实现 Comparator<Person> 的类的一部分,您可以在某个地方实例化它以获得所需的比较器。您应该用唯一的 Comparator.comparing(Person::getLastName).thenComparing(Person::getFirstName) 替换该实例实例代替,在整个操作中使用。

例如。
// reusable
static final Comparator<Person> By_NAME = Comparator
.comparing(Person::getLastName).thenComparing(Person::getFirstName);

或临时
listOfPersons.sort(Comparator.comparing(Person::getLastName)
.thenComparing(Person::getFirstName));

如果你这样使用它,它很可能会更快。但是,您应该看到,不可能有简单的基于模式的替换。您必须用那个简单的声明性构造替换类的使用站点,并决定是对多个使用站点使用共享比较器实例还是临时创建它。然后,您可以删除整个旧的实现类,或者至少,如果它仍然用于其他目的,则从中删除比较器功能。

关于intellij-idea - 用 Java 8 的 Comparator.comparing(...).thenComparing(...) 替换 CompareToBuilder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38176022/

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