正在阅读Oracle 关于接口的 Java 教程 https://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html其中给出了一个例子Card
(打牌)我试图理解接口中的默认方法 https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html。这是link https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html,“在现有接口中集成默认方法”部分。现在,在最后一部分中,他们首先按等级然后按花色对牌进行排序。给出了以下逻辑。假设所使用的任何接口、函数或类都已定义并sort
函数需要一个Comparator
Logic 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();
}
}
Logic 2:
myDeck.sort(
Comparator
.comparing(Card::getRank)
.thenComparing(Comparator.comparing(Card::getSuit)));
现在我在理解第二个逻辑时遇到了一些问题。我阅读了 Java 1.8 中包含的比较器接口和新的静态方法。现在我明白了这样的事情myDeck.sort(Comparator.comparing(Card::getRank))
按排名排序,但阅读后的文档thenComparing https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#thenComparing-java.util.Comparator-,我无法理解如何thenComparing
返回一个Comparator https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html它实现了上述逻辑1。它内部是否构建了类似的东西if-else
按照逻辑 1 中指定的方式构造?
是的,它在内部创建了类似的东西,只是使用了更多的中间 lambda。假设你的getRank
and getSuit
方法返回可比较类的一些实例Rank
and Suit
,在您的情况下,您实际上拥有:
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));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)