| /* |
| * Copyright 2007 Google Inc. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| * use this file except in compliance with the License. You may obtain a copy of |
| * the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| * License for the specific language governing permissions and limitations under |
| * the License. |
| */ |
| package java.util; |
| |
| import static javaemul.internal.InternalPreconditions.checkNotNull; |
| |
| import java.io.Serializable; |
| import java.util.function.Function; |
| import java.util.function.ToDoubleFunction; |
| import java.util.function.ToIntFunction; |
| import java.util.function.ToLongFunction; |
| |
| /** |
| * An interface used a basis for implementing custom ordering. <a |
| * href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/Comparator.html">[Sun |
| * docs]</a> |
| * |
| * @param <T> the type to be compared. |
| */ |
| @FunctionalInterface |
| public interface Comparator<T> { |
| |
| int compare(T a, T b); |
| |
| @Override |
| boolean equals(Object other); |
| |
| default Comparator<T> reversed() { |
| return new Comparators.ReversedComparator<T>(this); |
| } |
| |
| default Comparator<T> thenComparing(Comparator<? super T> other) { |
| checkNotNull(other); |
| return (Comparator<T> & Serializable) (a, b) -> { |
| int c = compare(a, b); |
| return (c != 0) ? c : other.compare(a, b); |
| }; |
| } |
| |
| default <U> Comparator<T> thenComparing(Function<? super T, ? extends U> keyExtractor, |
| Comparator<? super U> keyComparator) { |
| return thenComparing(comparing(keyExtractor, keyComparator)); |
| } |
| |
| default <U extends Comparable<? super U>> Comparator<T> thenComparing( |
| Function<? super T, ? extends U> keyExtractor) { |
| return thenComparing(comparing(keyExtractor)); |
| } |
| |
| default Comparator<T> thenComparingInt(ToIntFunction<? super T> keyExtractor) { |
| return thenComparing(comparingInt(keyExtractor)); |
| } |
| |
| default Comparator<T> thenComparingLong(ToLongFunction<? super T> keyExtractor) { |
| return thenComparing(comparingLong(keyExtractor)); |
| } |
| |
| default Comparator<T> thenComparingDouble(ToDoubleFunction<? super T> keyExtractor) { |
| return thenComparing(comparingDouble(keyExtractor)); |
| } |
| |
| static <T, U> Comparator<T> comparing(Function<? super T, ? extends U> keyExtractor, |
| Comparator<? super U> keyComparator) { |
| checkNotNull(keyExtractor); |
| checkNotNull(keyComparator); |
| return (Comparator<T> & Serializable) (a, b) -> |
| keyComparator.compare(keyExtractor.apply(a), keyExtractor.apply(b)); |
| } |
| |
| static <T, U extends Comparable<? super U>> Comparator<T> comparing( |
| Function<? super T, ? extends U> keyExtractor) { |
| return comparing(keyExtractor, naturalOrder()); |
| } |
| |
| static<T> Comparator<T> comparingDouble(ToDoubleFunction<? super T> keyExtractor) { |
| checkNotNull(keyExtractor); |
| return (Comparator<T> & Serializable) (a, b) -> |
| Double.compare(keyExtractor.applyAsDouble(a), keyExtractor.applyAsDouble(b)); |
| } |
| |
| static <T> Comparator<T> comparingInt(ToIntFunction<? super T> keyExtractor) { |
| checkNotNull(keyExtractor); |
| return (Comparator<T> & Serializable) (a, b) -> |
| Integer.compare(keyExtractor.applyAsInt(a), keyExtractor.applyAsInt(b)); |
| } |
| |
| static <T> Comparator<T> comparingLong(ToLongFunction<? super T> keyExtractor) { |
| checkNotNull(keyExtractor); |
| return (Comparator<T> & Serializable) (a, b) -> |
| Long.compare(keyExtractor.applyAsLong(a), keyExtractor.applyAsLong(b)); |
| } |
| |
| static <T extends Comparable<? super T>> Comparator<T> naturalOrder() { |
| return Comparators.naturalOrder(); |
| } |
| |
| static <T> Comparator<T> nullsFirst(Comparator<? super T> comparator) { |
| return new Comparators.NullComparator<>(true, comparator); |
| } |
| |
| static <T> Comparator<T> nullsLast(Comparator<? super T> comparator) { |
| return new Comparators.NullComparator<>(false, comparator); |
| } |
| |
| static <T extends Comparable<? super T>> Comparator<T> reverseOrder() { |
| return Comparators.reverseNaturalOrder(); |
| } |
| } |