gpt4 book ai didi

java - java中的比较器链

转载 作者:搜寻专家 更新时间:2023-10-30 21:44:27 26 4
gpt4 key购买 nike

阅读Java Tutorial by Oracle on interfaces这给出了一个关于 Card (扑克牌)的例子我试图理解 default methods in interfaces .这是 link ,“在现有接口(interface)中集成默认方法”部分。现在在最后一部分中,他们首先按等级对卡片进行排序,然后再按花色对卡片进行排序。给出了以下逻辑。假设已定义使用的任何接口(interface)、函数或类,并且 sort 函数采用 Comparator

逻辑 1:

package defaultmethods;

import java.util.*;
import java.util.stream.*;
import java.lang.*;

public class SortByRankThenSuit implements Comparator<Card> {
public int compare(Card firstCard, Card secondCard) {
int compVal =
firstCard.getRank().value() - secondCard.getRank().value();
if (compVal != 0)
return compVal;
else
return firstCard.getSuit().value() - secondCard.getSuit().value();
}
}

逻辑 2:

myDeck.sort(
Comparator
.comparing(Card::getRank)
.thenComparing(Comparator.comparing(Card::getSuit)));

现在我在理解第二种逻辑时遇到了一些问题。我阅读了 Java 1.8 中包含的比较器接口(interface)和新的静态方法。现在我明白了像这样的 myDeck.sort(Comparator.comparing(Card::getRank)) 是按排名排序的,但是在阅读了 the documentation for thenComparing 之后,我无法理解 thenComparing 如何返回 Comparator它实现了上述逻辑 1。它是否在内部构建类似于逻辑 1 中指定的 if-else 构造的东西?

最佳答案

是的,它在内部创建了类似的东西,只是使用了更多的中间 lambda。假设您的 getRankgetSuit 方法返回可比类 RankSuit 的一些实例,在您的情况下您有效有:

Function<Card, Rank> toRank = Card::getRank;
Comparator<Card> comp1 = (a, b) -> toRank.apply(a).compareTo(toRank.apply(b));
Function<Card, Suit> toSuit = Card::getSuit;
Comparator<Card> comp2 = (a, b) -> toSuit.apply(a).compareTo(toSuit.apply(b));
Comparator<Card> result = (a, b) -> {
int res = comp1.compare(a, b);
return res != 0 ? res : comp2.compare(a, b);
};

所以在内联(可能由 JIT 编译器执行)之后,您可能会有这样的事情:

Comparator<Card> result = (a, b) -> {
int res = a.getRank().compareTo(b.getRank());
return res != 0 ? res : a.getSuit().compareTo(b.getSuit());
};

请注意,您可以使用更简单的版本:

myDeck.sort(
Comparator
.comparing(Card::getRank)
.thenComparing(Card::getSuit));

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

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