版本
JDK8(JDK1.8)

Comparator接口重点
1.Comparator接口是一个函数式接口,里面只有一个虚方法compare(T o1, T o2),该接口表示一个比较器,而实现Comparable接口则表示其实现类是可比较的,Comparable接口的虚方法是compareTo(T o)
Comparable接口源码可以看我这篇位置 Comparable

2.compare(T o1, T o2) 返回值大于0,表示 o1 - o2 > 0,若o1,o2相等,则compare(T o1, T o2) 返回0

3.Comparator接口方法
注:then开头比较器都是二次比较器,在第一次调用this.compare(T o1, T o2)两者相等,才会使用一个新的比较器来区分两者顺序,如果第一次都不相等,则不会调用后续比较器

方法名 作用
int compare(T o1, T o2) 返回 o1 - o2 的值
Comparator comparing(Function keyExtractor) 返回一个新的比较器,其比较规则先经过keyExtractor处理o1和o2后,再将处理后的值相减c比较大小(类似相减,其实是调用compareTo)
Comparator comparing( Function keyExtractor, Comparator keyComparator) 返回一个新的比较器,其比较规则先经过keyExtractor处理o1和o2后,再将使用keyComparator比较器的规则比较大小
Comparator comparingInt(ToIntFunction keyExtractor) 和上面comparing(Function keyExtractor) 差不多,只不过ToIntFunction处理后得到的值是Int,则再两个Int相减
Comparator comparingLong(ToLongFunction keyExtractor) 和上面comparing(Function keyExtractor) 差不多,只不过ToLongFunction处理后得到的值是Long,则再两个Long相减
Comparator comparingDouble(ToDoubleFunction keyExtractor) 和上面comparing(Function keyExtractor) 差不多,只不过ToDoubleFunction处理后得到的值是Double,则再两个Double相减
Comparator naturalOrder() 返回一个自然顺序比较器,比较规则为o1.compareTo(o2),相当于o1-o2
Comparator reverseOrder() 返回一个与自然顺序比较器相反的比较器,比较规则为o2.compareTo(o1),相当于o2-o1
Comparato nullsFirst(Comparator comparator) 返回一个空友好的比较器,该比较器认为null小于非空,两个null相等
Comparator nullsLast(Comparator comparator) 返回一个空友好的比较器,该比较器认为null大于非空,两个null相等
Comparator reversed() 返回一个新的比较器,它的compare(T o1, T o2) 的作用变成返回 o2 - o1 的值,即相反
Comparator thenComparing(Comparator other) 返回一个新的比较器,当调用this.compare(T o1, T o2)时o1和o2相等,再调用other.compare(T o1, T o2)比较o1,o2,如果第一步不相等则直接返回,下面也一样
Comparator thenComparing(Function keyExtractor) 当调用this.compare(T o1, T o2)时o1和o2相等,上面的other比较器用以下步骤生成的比较器替代,该比较器符合以下步骤,会先用keyExtractor处理o1,o2,然后直接把处理后的值相减
Comparator thenComparing(Function keyExtractor, Comparator keyComparator) 当调用this.compare(T o1, T o2)时o1和o2相等,上面的other比较器用以下步骤生成的比较器替代,该比较器符合以下步骤,先用keyExtractor处理o1,o2,再调用keyComparator比较处理后的值
Comparator thenComparingInt(ToIntFunction keyExtractor) 和上面 thenComparing(Function keyExtractor)差不多,只是 只不过ToIntFunction处理后得到的值是Int,然后两个Int相减
Comparator thenComparingLong(ToLongFunction keyExtractor) 和上面 thenComparing(Function keyExtractor)差不多,只不过ToLongFunction处理后得到的值是Long,则再两个Long相减
Comparator thenComparingDouble(ToDoubleFunction keyExtractor) 和上面 thenComparing(Function keyExtractor)差不多, 只不过ToDoubleFunction处理后得到的值是Double,则再两个Double相减

Comparator接口源码

package java.util;import java.io.Serializable;
import java.util.function.Function;
import java.util.function.ToIntFunction;
import java.util.function.ToLongFunction;
import java.util.function.ToDoubleFunction;
import java.util.Comparators;/*** A comparison function, which imposes a <i>total ordering</i> on some* collection of objects.  Comparators can be passed to a sort method (such* as {@link Collections#sort(List,Comparator) Collections.sort} or {@link* Arrays#sort(Object[],Comparator) Arrays.sort}) to allow precise control* over the sort order.  Comparators can also be used to control the order of* certain data structures (such as {@link SortedSet sorted sets} or {@link* SortedMap sorted maps}), or to provide an ordering for collections of* objects that don't have a {@link Comparable natural ordering}.<p>* 一种比较函数,它对某些对象集合施加总排序。* 可以将比较器传递给排序方法(例如Collections#sort(List,Comparator)或* Arrays#sort(Object[],Comparator)),以便精确控制排序顺序。* 比较器还可用于控制某些数据结构的顺序(如SortedSet或SortedMap),* 或为没有Comparable自然顺序的对象集合提供排序。** The ordering imposed by a comparator {@code c} on a set of elements* {@code S} is said to be <i>consistent with equals</i> if and only if* {@code c.compare(e1, e2)==0} has the same boolean value as* {@code e1.equals(e2)} for every {@code e1} and {@code e2} in* {@code S}.<p>* 当且仅当c.compare(e1,e2)具有与e1和e2中的每一个e1和e2相同的布尔值时,* 比较器c对一组元素S施加的排序称为与等于一致。* * * ** Caution should be exercised when using a comparator capable of imposing an* ordering inconsistent with equals to order a sorted set (or sorted map).* Suppose a sorted set (or sorted map) with an explicit comparator {@code c}* is used with elements (or keys) drawn from a set {@code S}.  If the* ordering imposed by {@code c} on {@code S} is inconsistent with equals,* the sorted set (or sorted map) will behave "strangely."  In particular the* sorted set (or sorted map) will violate the general contract for set (or* map), which is defined in terms of {@code equals}.<p>* 当使用比较器时,应谨慎使用,* 比较器能够对排序集(或排序映射)施加与等于不一致的排序。* 假设一个带有显式比较器c的排序集(或排序映射)与从集合S中提取的元素(或键)一起使用。* 如果c对S施加的排序与等于不一致,则排序集(或排序映射)的行为将“奇怪”。* 特别是排序集(或排序映射)将违反集合(或映射)的一般契约,* 该契约是根据equals定义的。* * * * ** For example, suppose one adds two elements {@code a} and {@code b} such that* {@code (a.equals(b) && c.compare(a, b) != 0)}* to an empty {@code TreeSet} with comparator {@code c}.* The second {@code add} operation will return* true (and the size of the tree set will increase) because {@code a} and* {@code b} are not equivalent from the tree set's perspective, even though* this is contrary to the specification of the* {@link Set#add Set.add} method.<p>* 例如,假设添加两个元素a和b,使得(a.equals(b) && c.compare(a, b) != 0)* 到带有比较器c的空TreeSet。第二个add操作将返回true(树集的大小将增加),* 因为从树集的角度来看a和b并不等价,即使这与set#add方法的规范相反。* * * * ** Note: It is generally a good idea for comparators to also implement* {@code java.io.Serializable}, as they may be used as ordering methods in* serializable data structures (like {@link TreeSet}, {@link TreeMap}).  In* order for the data structure to serialize successfully, the comparator (if* provided) must implement {@code Serializable}.<p>* 注意:比较器也实现java.io.Serializable通常是一个好主意,* 因为它们可以用作可序列化数据结构(如TreeSet、TreeMap)中的排序方法。* 为了成功序列化数据结构,比较器(如果提供)必须实现Serializable* * * ** For the mathematically inclined, the <i>relation</i> that defines the* <i>imposed ordering</i> that a given comparator {@code c} imposes on a* given set of objects {@code S} is:* 对于数学上倾向的,定义给定比较器c对给定对象集S施加的强制顺序的关系为:* * <pre>*       {(x, y) such that c.compare(x, y) <= 0}.* </pre> * The <i>quotient</i> for this total order is:* 此总顺序的商为:* <pre>*       {(x, y) such that c.compare(x, y) == 0}.* </pre>** It follows immediately from the contract for {@code compare} that the* quotient is an <i>equivalence relation</i> on {@code S}, and that the* imposed ordering is a <i>total order</i> on {@code S}.  When we say that* the ordering imposed by {@code c} on {@code S} is <i>consistent with* equals</i>, we mean that the quotient for the ordering is the equivalence* relation defined by the objects' {@link Object#equals(Object)* equals(Object)} method(s):* 紧接着从compare的契约可以看出,商是S上的等价关系,* 并且强加的顺序是S上的总顺序。当我们说c对S施加的排序与等于一致时,* 我们的意思是排序的商是由对象Object#equals(Object)方法定义的等价关系* * * * <pre>*     {(x, y) such that x.equals(y)}. * </pre>** <p>Unlike {@code Comparable}, a comparator may optionally permit* comparison of null arguments, while maintaining the requirements for* an equivalence relation.* 与Comparable不同,比较器可以选择允许比较空参数,同时保持对等价关系的要求。** <p>This interface is a member of the* <a href="{@docRoot}/java/util/package-summary.html#CollectionsFramework">* Java Collections Framework</a>.** @param <T> the type of objects that may be compared by this comparator** @author  Josh Bloch* @author  Neal Gafter* @see Comparable* @see java.io.Serializable* @since 1.2*/
@FunctionalInterface
public interface Comparator<T> {/*** Compares its two arguments for order.  Returns a negative integer,* zero, or a positive integer as the first argument is less than, equal* to, or greater than the second.<p>* 比较其两个参数的顺序。返回负整数、零或正整数,* 因为第一个参数小于、等于或大于第二个参数。** The implementor must ensure that {@code sgn(compare(x, y)) ==* -sgn(compare(y, x))} for all {@code x} and {@code y}.  (This* implies that {@code compare(x, y)} must throw an exception if and only* if {@code compare(y, x)} throws an exception.)<p>* 实现者必须确保所有x和y的sgn(compare(x, y)) ==-sgn(compare(y, x))。* (这意味着compare(x, y)必须在且仅在 compare(y, x)引发异常时引发异常。)** The implementor must also ensure that the relation is transitive:* {@code ((compare(x, y)>0) && (compare(y, z)>0))} implies* {@code compare(x, z)>0}.<p>* 实现者还必须确保关系是可传递的:* ((compare(x, y)>0) && (compare(y, z)>0))意味着compare(x, z)>0* * * ** Finally, the implementor must ensure that {@code compare(x, y)==0}* implies that {@code sgn(compare(x, z))==sgn(compare(y, z))} for all* {@code z}.<p>* 最后,实现者必须确保compare(x, y)==0意味着所有z的* sgn(compare(x, z))==sgn(compare(y, z))* * ** It is generally the case, but <i>not</i> strictly required that* {@code (compare(x, y)==0) == (x.equals(y))}.  Generally speaking,* any comparator that violates this condition should clearly indicate* this fact.  The recommended language is "Note: this comparator* imposes orderings that are inconsistent with equals."<p>* 通常是这样的,但不是严格要求(compare(x, y)==0) == (x.equals(y))。* 一般来说,任何违反这一条件的比较国都应明确指出这一事实。* 推荐的语言是“注意:这个比较器强加的顺序与equals不一致。”* ** In the foregoing description, the notation* {@code sgn(}<i>expression</i>{@code )} designates the mathematical* <i>signum</i> function, which is defined to return one of {@code -1},* {@code 0}, or {@code 1} according to whether the value of* <i>expression</i> is negative, zero, or positive, respectively.* 在前面的描述中,符号sgn(expression)指定数学符号函数,* 该函数被定义为根据表达式的值是负、零还是正分别返回-1、0或1中的一个。** @param o1 the first object to be compared. 第一个要比较的对象。* @param o2 the second object to be compared. 要比较的第二个对象。* @return a negative integer, zero, or a positive integer as the*         first argument is less than, equal to, or greater than the*         second. 作为第一个参数的负整数、零或正整数小于、等于或大于第二个参数。* @throws NullPointerException if an argument is null and this*         comparator does not permit null arguments* @throws ClassCastException if the arguments' types prevent them from*         being compared by this comparator. 如果参数的类型阻止此比较器对其进行比较。*/int compare(T o1, T o2);/*** Indicates whether some other object is &quot;equal to&quot; this* comparator.  This method must obey the general contract of* {@link Object#equals(Object)}.  Additionally, this method can return* {@code true} <i>only</i> if the specified object is also a comparator* and it imposes the same ordering as this comparator.  Thus,* {@code comp1.equals(comp2)} implies that {@code sgn(comp1.compare(o1,* o2))==sgn(comp2.compare(o1, o2))} for every object reference* {@code o1} and {@code o2}.<p>* 指示其他对象是否等于此比较器。* 此方法必须遵守Object#equals(Object)的一般约定。* 此外,仅当指定的对象也是一个比较器并且它施加了与此比较器相同的顺序时,* 此方法才能返回true。因此,comp1.equals(comp2)意味着对于每个对象引用o1和o2都有* sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2))* 。* * ** Note that it is <i>always</i> safe <i>not</i> to override* {@code Object.equals(Object)}.  However, overriding this method may,* in some cases, improve performance by allowing programs to determine* that two distinct comparators impose the same order.* 注意,不重写Object.equals(Object)总是安全的。* 但是,在某些情况下,* 重写此方法可以通过允许程序确定两个不同的比较器施加相同的顺序来提高性能。** @param   obj   the reference object with which to compare.* @return  {@code true} only if the specified object is also*          a comparator and it imposes the same ordering as this*          comparator.* @see Object#equals(Object)* @see Object#hashCode()*/boolean equals(Object obj);/*** Returns a comparator that imposes the reverse ordering of this* comparator.* 返回一个比较器,该比较器对该比较器进行反向排序。** @return a comparator that imposes the reverse ordering of this*         comparator. 一种比较器,对该比较器进行反向排序* @since 1.8*/default Comparator<T> reversed() {return Collections.reverseOrder(this);}/*** Returns a lexicographic-order comparator with another comparator.* If this {@code Comparator} considers two elements equal, i.e.* {@code compare(a, b) == 0}, {@code other} is used to determine the order.* 返回一个字典顺序比较器和另一个比较器。如果此Comparator认为两个元素相等,* 即compare(a, b) == 0,则使用other确定顺序。** <p>The returned comparator is serializable if the specified comparator* is also serializable.* 如果指定的比较器也可序列化,则返回的比较器可序列化。** @apiNote* For example, to sort a collection of {@code String} based on the length* and then case-insensitive natural ordering, the comparator can be* composed using following code,* 例如,要根据长度对String集合进行排序,* 然后进行不区分大小写的自然排序,可以使用以下代码组合比较器:,** <pre>{@code*     Comparator<String> cmp = Comparator.comparingInt(String::length)*             .thenComparing(String.CASE_INSENSITIVE_ORDER);* }</pre>** @param  other the other comparator to be used when this comparator*         compares two objects that are equal. 当此比较器比较两个相等的对象时要使用的另一个比较器。* @return a lexicographic-order comparator composed of this and then the*         other comparator 由这个比较器和另一个比较器组成的字典顺序比较器* @throws NullPointerException if the argument is null.* @since 1.8*/default Comparator<T> thenComparing(Comparator<? super T> other) {Objects.requireNonNull(other);return (Comparator<T> & Serializable) (c1, c2) -> {int res = compare(c1, c2);return (res != 0) ? res : other.compare(c1, c2);};}/*** Returns a lexicographic-order comparator with a function that* extracts a key to be compared with the given {@code Comparator}.* 返回字典顺序比较器,该比较器具有一个函数,* 该函数提取要与给定comparator进行比较的键。** @implSpec This default implementation behaves as if {@code*           thenComparing(comparing(keyExtractor, cmp))}.*           这个默认实现的行为就像thenComparing(comparing(keyExtractor, cmp))** @param  <U>  the type of the sort key* @param  keyExtractor the function used to extract the sort key* @param  keyComparator the {@code Comparator} used to compare the sort key* @return a lexicographic-order comparator composed of this comparator*         and then comparing on the key extracted by the keyExtractor function*         一种字典顺序比较器,由该比较器组成,然后对keyExtractor函数提取的密钥进行比较* * * @throws NullPointerException if either argument is null. 如果任一参数为空。* @see #comparing(Function, Comparator)* @see #thenComparing(Comparator)* @since 1.8*/default <U> Comparator<T> thenComparing(Function<? super T, ? extends U> keyExtractor,Comparator<? super U> keyComparator){return thenComparing(comparing(keyExtractor, keyComparator));}/*** Returns a lexicographic-order comparator with a function that* extracts a {@code Comparable} sort key.* 返回一个字典顺序比较器,该比较器带有一个提取compariable排序键的函数。** @implSpec This default implementation behaves as if {@code*           thenComparing(comparing(keyExtractor))}.*          此默认实现的行为就像thenComparing(comparing(keyExtractor))** @param  <U>  the type of the {@link Comparable} sort key 可比较的排序键的类型* @param  keyExtractor the function used to extract the {@link*         Comparable} sort key 用于提取可比较排序键的函数* @return a lexicographic-order comparator composed of this and then the*         {@link Comparable} sort key. *         一种字典顺序比较器,由这个键和Comparable排序键组成。* * * @throws NullPointerException if the argument is null.* @see #comparing(Function)* @see #thenComparing(Comparator)* @since 1.8*/default <U extends Comparable<? super U>> Comparator<T> thenComparing(Function<? super T, ? extends U> keyExtractor){return thenComparing(comparing(keyExtractor));}/*** Returns a lexicographic-order comparator with a function that* extracts an {@code int} sort key.* 返回字典顺序比较器,该比较器带有一个提取int排序键的函数。** @implSpec This default implementation behaves as if {@code*           thenComparing(comparingInt(keyExtractor))}.*          这个默认实现的行为就像thenComparing(comparingInt(keyExtractor))** @param  keyExtractor the function used to extract the integer sort key 用于提取整数排序键的函数* @return a lexicographic-order comparator composed of this and then the*         {@code int} sort key 一种字典顺序比较器,由这个键和int排序键组成* @throws NullPointerException if the argument is null.* @see #comparingInt(ToIntFunction)* @see #thenComparing(Comparator)* @since 1.8*/default Comparator<T> thenComparingInt(ToIntFunction<? super T> keyExtractor) {return thenComparing(comparingInt(keyExtractor));}/*** Returns a lexicographic-order comparator with a function that* extracts a {@code long} sort key.* 返回字典顺序比较器,该比较器带有一个提取long排序键的函数。** @implSpec This default implementation behaves as if {@code*           thenComparing(comparingLong(keyExtractor))}.*          这个默认实现的行为就像thenComparing(comparingLong(keyExtractor))** @param  keyExtractor the function used to extract the long sort key 用于提取long排序键的函数* @return a lexicographic-order comparator composed of this and then the*         {@code long} sort key 一种字典顺序比较器,由这个键和long排序键组成* @throws NullPointerException if the argument is null.* @see #comparingLong(ToLongFunction)* @see #thenComparing(Comparator)* @since 1.8*/default Comparator<T> thenComparingLong(ToLongFunction<? super T> keyExtractor) {return thenComparing(comparingLong(keyExtractor));}/*** Returns a lexicographic-order comparator with a function that* extracts a {@code double} sort key.* 返回字典顺序比较器,该比较器带有一个提取double排序键的函数。** @implSpec This default implementation behaves as if {@code*           thenComparing(comparingDouble(keyExtractor))}.*           这个默认实现的行为就像thenComparing(comparingDouble(keyExtractor))* ** @param  keyExtractor the function used to extract the double sort key 用于提取double排序键的函数* @return a lexicographic-order comparator composed of this and then the*         {@code double} sort key 一种字典顺序比较器,由这个键和double排序键组成* @throws NullPointerException if the argument is null.* @see #comparingDouble(ToDoubleFunction)* @see #thenComparing(Comparator)* @since 1.8*/default Comparator<T> thenComparingDouble(ToDoubleFunction<? super T> keyExtractor) {return thenComparing(comparingDouble(keyExtractor));}/*** Returns a comparator that imposes the reverse of the <em>natural* ordering</em>.* 返回与自然顺序相反的比较器** <p>The returned comparator is serializable and throws {@link* NullPointerException} when comparing {@code null}.* 返回的比较器可序列化,并在比较null时抛出NullPointerException** @param  <T> the {@link Comparable} type of element to be compared 待比较元素的可比较类型* @return a comparator that imposes the reverse of the <i>natural*         ordering</i> on {@code Comparable} objects.* @see Comparable* @since 1.8*/public static <T extends Comparable<? super T>> Comparator<T> reverseOrder() {return Collections.reverseOrder();}/*** Returns a comparator that compares {@link Comparable} objects in natural* order.* 返回按自然顺序比较Comparable对象的比较器。** <p>The returned comparator is serializable and throws {@link* NullPointerException} when comparing {@code null}.* 返回的比较器可序列化,并在比较null时抛出NullPointerException** @param  <T> the {@link Comparable} type of element to be compared 要比较的元素的Comparable类型* @return a comparator that imposes the <i>natural ordering</i> on {@code*         Comparable} objects. 对compariable对象施加自然排序的比较器。* @see Comparable* @since 1.8*/@SuppressWarnings("unchecked")public static <T extends Comparable<? super T>> Comparator<T> naturalOrder() {return (Comparator<T>) Comparators.NaturalOrderComparator.INSTANCE;}/*** Returns a null-friendly comparator that considers {@code null} to be* less than non-null. When both are {@code null}, they are considered* equal. If both are non-null, the specified {@code Comparator} is used* to determine the order. If the specified comparator is {@code null},* then the returned comparator considers all non-null values to be equal.* 返回一个空友好的比较器,该比较器认为null小于非空。* 当两者都是null时,它们被视为相等。* 如果两者都非空,则使用指定的Comparator确定顺序。* 如果指定的比较器为null,则返回的比较器将认为所有非null值相等。** <p>The returned comparator is serializable if the specified comparator* is serializable.* 如果指定的比较器可序列化,则返回的比较器可序列化。** @param  <T> the type of the elements to be compared* @param  comparator a {@code Comparator} for comparing non-null values* @return a comparator that considers {@code null} to be less than*         non-null, and compares non-null objects with the supplied*         {@code Comparator}.*         一种比较器,它认为null小于非null,并将非null对象与提供的comparator进行比较。* @since 1.8*/public static <T> Comparator<T> nullsFirst(Comparator<? super T> comparator) {return new Comparators.NullComparator<>(true, comparator);}/*** Returns a null-friendly comparator that considers {@code null} to be* greater than non-null. When both are {@code null}, they are considered* equal. If both are non-null, the specified {@code Comparator} is used* to determine the order. If the specified comparator is {@code null},* then the returned comparator considers all non-null values to be equal.* 返回一个空友好的比较器,该比较器认为null大于非空。* 当两者都是null时,它们被视为相等。如果两者都非空,* 则使用指定的Comparator确定顺序。如果指定的比较器为null,* 则返回的比较器将认为所有非null值相等。** <p>The returned comparator is serializable if the specified comparator* is serializable.* 如果指定的比较器可序列化,则返回的比较器可序列化。** @param  <T> the type of the elements to be compared* @param  comparator a {@code Comparator} for comparing non-null values* @return a comparator that considers {@code null} to be greater than*         non-null, and compares non-null objects with the supplied*         {@code Comparator}.*         一种比较器,它认为null大于非null,*         并将非null对象与提供的 comparator 进行比较。* * @since 1.8*/public static <T> Comparator<T> nullsLast(Comparator<? super T> comparator) {return new Comparators.NullComparator<>(false, comparator);}/*** Accepts a function that extracts a sort key from a type {@code T}, and* returns a {@code Comparator<T>} that compares by that sort key using* the specified {@link Comparator}.* 接受一个函数,该函数从类型T中提取排序键,* 并返回一个Comparator<T>,使用指定的Comparator按该排序键进行比较。** <p>The returned comparator is serializable if the specified function* and comparator are both serializable.* 如果指定的函数和比较器都可序列化,则返回的比较器可序列化。** @apiNote* For example, to obtain a {@code Comparator} that compares {@code* Person} objects by their last name ignoring case differences,* 例如,要获得一个Comparator,* 它根据Person对象的姓氏比较Person对象,忽略大小写差异,** <pre>{@code*     Comparator<Person> cmp = Comparator.comparing(*             Person::getLastName,*             String.CASE_INSENSITIVE_ORDER);* }</pre>** @param  <T> the type of element to be compared* @param  <U> the type of the sort key* @param  keyExtractor the function used to extract the sort key 用于提取排序键的函数* @param  keyComparator the {@code Comparator} used to compare the sort key 用于比较排序键的Comparator* @return a comparator that compares by an extracted key using the*         specified {@code Comparator} 一种比较器,使用指定的comparator通过提取的键进行比较* @throws NullPointerException if either argument is null* @since 1.8*/public static <T, U> Comparator<T> comparing(Function<? super T, ? extends U> keyExtractor,Comparator<? super U> keyComparator){Objects.requireNonNull(keyExtractor);Objects.requireNonNull(keyComparator);return (Comparator<T> & Serializable)(c1, c2) -> keyComparator.compare(keyExtractor.apply(c1),keyExtractor.apply(c2));}/*** Accepts a function that extracts a {@link java.lang.Comparable* Comparable} sort key from a type {@code T}, and returns a {@code* Comparator<T>} that compares by that sort key.* 接受一个函数,该函数从类型T中提取java.lang.Comparable排序键,* 并返回一个Comparator<T>按该排序键进行比较。** <p>The returned comparator is serializable if the specified function* is also serializable.* 如果指定的函数也可序列化,则返回的比较器可序列化。** @apiNote* For example, to obtain a {@code Comparator} that compares {@code* Person} objects by their last name,* 例如,要获得一个Comparator,它根据Person对象的姓氏对其进行比较,** <pre>{@code*     Comparator<Person> byLastName = Comparator.comparing(Person::getLastName);* }</pre>** @param  <T> the type of element to be compared* @param  <U> the type of the {@code Comparable} sort key* @param  keyExtractor the function used to extract the {@link*         Comparable} sort key* @return a comparator that compares by an extracted key* @throws NullPointerException if the argument is null* @since 1.8*/public static <T, U extends Comparable<? super U>> Comparator<T> comparing(Function<? super T, ? extends U> keyExtractor){Objects.requireNonNull(keyExtractor);return (Comparator<T> & Serializable)(c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));}/*** Accepts a function that extracts an {@code int} sort key from a type* {@code T}, and returns a {@code Comparator<T>} that compares by that* sort key.* 接受一个函数,该函数从类型T中提取int排序键,* 并返回一个Comparator<T>以该排序键进行比较。** <p>The returned comparator is serializable if the specified function* is also serializable.* 如果指定的函数也可序列化,则返回的比较器可序列化。** @param  <T> the type of element to be compared 要比较的元素的类型* @param  keyExtractor the function used to extract the integer sort key 用于提取整数排序键的函数* @return a comparator that compares by an extracted key 通过提取的键进行比较的比较器* @see #comparing(Function)* @throws NullPointerException if the argument is null* @since 1.8*/public static <T> Comparator<T> comparingInt(ToIntFunction<? super T> keyExtractor) {Objects.requireNonNull(keyExtractor);return (Comparator<T> & Serializable)(c1, c2) -> Integer.compare(keyExtractor.applyAsInt(c1), keyExtractor.applyAsInt(c2));}/*** Accepts a function that extracts a {@code long} sort key from a type* {@code T}, and returns a {@code Comparator<T>} that compares by that* sort key.* 接受一个函数,该函数从类型T中提取long排序键,* 并返回一个Comparator<T>以该排序键进行比较。** <p>The returned comparator is serializable if the specified function is* also serializable.* 如果指定的函数也可序列化,则返回的比较器可序列化。** @param  <T> the type of element to be compared 要比较的元素的类型* @param  keyExtractor the function used to extract the long sort key 用于提取长排序键的函数* @return a comparator that compares by an extracted key 通过提取的键进行比较的比较器* @see #comparing(Function)* @throws NullPointerException if the argument is null* @since 1.8*/public static <T> Comparator<T> comparingLong(ToLongFunction<? super T> keyExtractor) {Objects.requireNonNull(keyExtractor);return (Comparator<T> & Serializable)(c1, c2) -> Long.compare(keyExtractor.applyAsLong(c1), keyExtractor.applyAsLong(c2));}/*** Accepts a function that extracts a {@code double} sort key from a type* {@code T}, and returns a {@code Comparator<T>} that compares by that* sort key.* 接受一个函数,该函数从类型T中提取double排序键,* 并返回一个Comparator<T>以该排序键进行比较。** <p>The returned comparator is serializable if the specified function* is also serializable.* 如果指定的函数也可序列化,则返回的比较器可序列化。** @param  <T> the type of element to be compared* @param  keyExtractor the function used to extract the double sort key* @return a comparator that compares by an extracted key* @see #comparing(Function)* @throws NullPointerException if the argument is null* @since 1.8*/public static<T> Comparator<T> comparingDouble(ToDoubleFunction<? super T> keyExtractor) {Objects.requireNonNull(keyExtractor);return (Comparator<T> & Serializable)(c1, c2) -> Double.compare(keyExtractor.applyAsDouble(c1), keyExtractor.applyAsDouble(c2));}
}

Java Comparator源码总结 Comparator源码注释翻译和解析中英文对照版相关推荐

  1. Java Spliterator接口总结 Spliterator接口注释翻译和解析中英文对照版

    Spliterator接口重点 Spliterator接口是迭代器Iterator改版,只不过Spliterator可以并行的遍历元素,但是Spliterator不是线程安全的,并行的关键在于 try ...

  2. Java ReentrantLock源码总结 ReentrantLock源码注释翻译和解析中英文对照版 AQS虚拟类的实现

    文章目录 ReentrantLock类源码重点 具体实现 lock操作 acquire操作 tryAcquire操作 公平锁版本 非公平锁版本 lockInterruptibly操作 acquireI ...

  3. Java BiConsumer源码总结 BiConsumer接口注释翻译和解析中英文对照版

    BiConsumer函数式接口源码重点 1.BiConsume是一个函数式接口,里面只有一个需要实现的方法是 void accept(T t, U u),表示一个接受两个输入参数但不返回结果的操作,通 ...

  4. 死磕 java集合之TreeMap源码分析(一)——红黑树全解析

    欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. 简介 TreeMap使用红黑树存储元素,可以保证元素按key值的大小进行遍历. 继承体系 Tr ...

  5. java的数组与Arrays类源码详解

    java的数组与Arrays类源码详解 java.util.Arrays 类是 JDK 提供的一个工具类,用来处理数组的各种方法,而且每个方法基本上都是静态方法,能直接通过类名Arrays调用. 类的 ...

  6. Java集合(超详细-含源码)

    一 集合体系结构 集合的体系结构分为单列集合和双列集合 二 Collection单列集合 Collection是单列集合的祖宗接口,他的功能是全部单列集合都可以继承使用的. 单列集合接口下又分为Lis ...

  7. java web学习项目20套源码完整版

    java web学习项目20套源码完整版 自己收集的各行各业的都有,这一套源码吃遍所有作业项目! 1.BBS论坛系统(jsp+sql) 2.ERP管理系统(jsp+servlet) 3.OA办公自动化 ...

  8. java B2B2C springmvc mybatis电子商务平台源码-Consul服务发现原理...

    Consul 是什么 Consul 是一个支持多数据中心分布式高可用的服务发现和配置共享的服务软件,由 HashiCorp 公司用 Go 语言开发, 基于 Mozilla Public License ...

  9. java b2b2c shop 多用户商城系统源码- eureka集群整合hystrix框架

    继之前项目继续整合hystrix框架,hystrix框架为Netflix的模块,是一个容错框架.当用户访问服务调用者的时候,如果服务提供者出现异常导致无法正常返回出现请求超时的情况,而服务调用者并不知 ...

最新文章

  1. KDE与GNOME的起源与发展
  2. 通过ObjectMapper将实体转成字符串 ,将 用json存的的list 回转list
  3. Dominant Character 思维,字符串,贪心
  4. linux传几百G文件,为什么我不推荐另外2种快速传几百G文件的方法!
  5. 信息学奥赛一本通(1162:字符串逆序)
  6. 学好java再学c 可以吗_再论学好C的重要性!!!
  7. [svn] 解决SVN冲突攻略(手册)
  8. Revit软件安装族库/族样板/项目样板默认位置在哪?(详细说明)
  9. x58添加uefi_x58 主板 使用 pcie nvme ssd 引导启动
  10. 电容或电感的电压_用动画来解释电感和电容元件上电压电流超前滞后的关系
  11. ET vs Ad hoc
  12. 这4款浏览器必装插件,让浏览器使用体验上升100%
  13. 如何在ppt中生成柱状图_PPT幻灯片中怎么插入柱形图数据图表?
  14. ffmpeg 图片合成视频黑屏 不兼容问题合成MP4
  15. 004-中国五个城市PM 2.5数据分析
  16. 山东大学计算机考研909真题,2012年山东大学909数据结构考研试题(回忆版)
  17. 伦敦国王学院计算机申请要求,伦敦大学国王学院教育中计算机应用文学硕士研究生申请要求及申请材料要求清单...
  18. debian linux 7 安装,Debian 7.0.0安装图解教程
  19. python3.7豆瓣 post 数据(一)
  20. 2023,再转行去做软件测试还有前途吗?

热门文章

  1. vue中页面数据改变组件不重新渲染
  2. 买卖股票的最大收益-动态规划
  3. c语言小狗字符画,谁能帮忙做个小狗的字符画?谢谢
  4. android 裁剪图片大小 控制图片尺寸
  5. 针对软件研发流程,我总结出的流水线生产方法论
  6. smartBi数据源连接与业务主题及七大数据集及透视分析与仪表盘四大分析展示经验总结
  7. 怎样在iPhone和Mac上取消订阅iCloud 储存空间?
  8. 主机托管在人工智能时代可以做出何种贡献
  9. python提取视频字幕_利用Python提取视频中的字幕(文字识别)
  10. 2021-2027全球及中国Cafe POS系统行业研究及十四五规划分析报告