diff --git a/spring-core/src/main/java/org/springframework/util/comparator/BooleanComparator.java b/spring-core/src/main/java/org/springframework/util/comparator/BooleanComparator.java index 33a357912d0..6f65f92d5b7 100644 --- a/spring-core/src/main/java/org/springframework/util/comparator/BooleanComparator.java +++ b/spring-core/src/main/java/org/springframework/util/comparator/BooleanComparator.java @@ -26,6 +26,7 @@ import org.springframework.lang.Nullable; * {@code true} or {@code false} first. * * @author Keith Donald + * @author Eugene Rabii * @since 1.2.2 */ @SuppressWarnings("serial") @@ -63,8 +64,9 @@ public class BooleanComparator implements Comparator, Serializable { @Override - public int compare(Boolean v1, Boolean v2) { - return (v1 ^ v2) ? ((v1 ^ this.trueLow) ? 1 : -1) : 0; + public int compare(Boolean left, Boolean right) { + int multiplier = this.trueLow ? -1 : 1; + return multiplier * Boolean.compare(left, right); } @@ -75,7 +77,7 @@ public class BooleanComparator implements Comparator, Serializable { @Override public int hashCode() { - return getClass().hashCode() * (this.trueLow ? -1 : 1); + return Boolean.hashCode(this.trueLow); } @Override diff --git a/spring-core/src/main/java/org/springframework/util/comparator/ComparableComparator.java b/spring-core/src/main/java/org/springframework/util/comparator/ComparableComparator.java index 07e7a9fed1f..27d36a38eb7 100644 --- a/spring-core/src/main/java/org/springframework/util/comparator/ComparableComparator.java +++ b/spring-core/src/main/java/org/springframework/util/comparator/ComparableComparator.java @@ -23,15 +23,18 @@ import java.util.Comparator; * Mainly for internal use in other Comparators, when supposed * to work on Comparables. * + * @deprecated use jdk-8 Comparator::naturalOrder * @author Keith Donald * @since 1.2.2 * @param the type of comparable objects that may be compared by this comparator * @see Comparable */ +@Deprecated public class ComparableComparator> implements Comparator { /** * A shared instance of this default comparator. + * * @see Comparators#comparable() */ @SuppressWarnings("rawtypes") diff --git a/spring-core/src/main/java/org/springframework/util/comparator/Comparators.java b/spring-core/src/main/java/org/springframework/util/comparator/Comparators.java index 543418fe519..36e7076045f 100644 --- a/spring-core/src/main/java/org/springframework/util/comparator/Comparators.java +++ b/spring-core/src/main/java/org/springframework/util/comparator/Comparators.java @@ -29,49 +29,44 @@ public abstract class Comparators { /** * Return a {@link Comparable} adapter. - * @see ComparableComparator#INSTANCE */ @SuppressWarnings("unchecked") public static Comparator comparable() { - return ComparableComparator.INSTANCE; + return (Comparator) Comparator.naturalOrder(); } /** * Return a {@link Comparable} adapter which accepts * null values and sorts them lower than non-null values. - * @see NullSafeComparator#NULLS_LOW */ @SuppressWarnings("unchecked") public static Comparator nullsLow() { - return NullSafeComparator.NULLS_LOW; + return (Comparator) Comparator.nullsLast(Comparator.naturalOrder()); } /** * Return a decorator for the given comparator which accepts * null values and sorts them lower than non-null values. - * @see NullSafeComparator#NullSafeComparator(boolean) */ public static Comparator nullsLow(Comparator comparator) { - return new NullSafeComparator<>(comparator, true); + return Comparator.nullsLast(comparator); } /** * Return a {@link Comparable} adapter which accepts * null values and sorts them higher than non-null values. - * @see NullSafeComparator#NULLS_HIGH */ @SuppressWarnings("unchecked") public static Comparator nullsHigh() { - return NullSafeComparator.NULLS_HIGH; + return (Comparator) Comparator.nullsFirst(Comparator.naturalOrder()); } /** * Return a decorator for the given comparator which accepts * null values and sorts them higher than non-null values. - * @see NullSafeComparator#NullSafeComparator(boolean) */ public static Comparator nullsHigh(Comparator comparator) { - return new NullSafeComparator<>(comparator, false); + return Comparator.nullsFirst(comparator); } } diff --git a/spring-core/src/main/java/org/springframework/util/comparator/NullSafeComparator.java b/spring-core/src/main/java/org/springframework/util/comparator/NullSafeComparator.java index ab131ad7fe8..4157f1cc80e 100644 --- a/spring-core/src/main/java/org/springframework/util/comparator/NullSafeComparator.java +++ b/spring-core/src/main/java/org/springframework/util/comparator/NullSafeComparator.java @@ -49,7 +49,6 @@ public class NullSafeComparator implements Comparator { @SuppressWarnings("rawtypes") public static final NullSafeComparator NULLS_HIGH = new NullSafeComparator<>(false); - private final Comparator nonNullComparator; private final boolean nullsLow; @@ -71,7 +70,7 @@ public class NullSafeComparator implements Comparator { */ @SuppressWarnings("unchecked") private NullSafeComparator(boolean nullsLow) { - this.nonNullComparator = ComparableComparator.INSTANCE; + this.nonNullComparator = (Comparator) Comparator.naturalOrder(); this.nullsLow = nullsLow; } @@ -92,17 +91,9 @@ public class NullSafeComparator implements Comparator { @Override - public int compare(@Nullable T o1, @Nullable T o2) { - if (o1 == o2) { - return 0; - } - if (o1 == null) { - return (this.nullsLow ? -1 : 1); - } - if (o2 == null) { - return (this.nullsLow ? 1 : -1); - } - return this.nonNullComparator.compare(o1, o2); + public int compare(@Nullable T left, @Nullable T right) { + Comparator comparator = this.nullsLow ? Comparator.nullsFirst(this.nonNullComparator) : Comparator.nullsLast(this.nonNullComparator); + return comparator.compare(left, right); } @@ -115,7 +106,7 @@ public class NullSafeComparator implements Comparator { @Override public int hashCode() { - return this.nonNullComparator.hashCode() * (this.nullsLow ? -1 : 1); + return Boolean.hashCode(this.nullsLow); } @Override diff --git a/spring-core/src/test/java/org/springframework/util/comparator/BooleanComparatorTests.java b/spring-core/src/test/java/org/springframework/util/comparator/BooleanComparatorTests.java index ae003d52c16..2022825b5ed 100644 --- a/spring-core/src/test/java/org/springframework/util/comparator/BooleanComparatorTests.java +++ b/spring-core/src/test/java/org/springframework/util/comparator/BooleanComparatorTests.java @@ -29,34 +29,35 @@ import static org.assertj.core.api.Assertions.assertThat; * @author Keith Donald * @author Chris Beams * @author Phillip Webb + * @author Eugene Rabii */ class BooleanComparatorTests { @Test void shouldCompareWithTrueLow() { Comparator c = new BooleanComparator(true); - assertThat(c.compare(true, false)).isEqualTo(-1); + assertThat(c.compare(true, false)).isLessThan(0); assertThat(c.compare(Boolean.TRUE, Boolean.TRUE)).isEqualTo(0); } @Test void shouldCompareWithTrueHigh() { Comparator c = new BooleanComparator(false); - assertThat(c.compare(true, false)).isEqualTo(1); + assertThat(c.compare(true, false)).isGreaterThan(0); assertThat(c.compare(Boolean.TRUE, Boolean.TRUE)).isEqualTo(0); } @Test void shouldCompareFromTrueLow() { Comparator c = BooleanComparator.TRUE_LOW; - assertThat(c.compare(true, false)).isEqualTo(-1); + assertThat(c.compare(true, false)).isLessThan(0); assertThat(c.compare(Boolean.TRUE, Boolean.TRUE)).isEqualTo(0); } @Test void shouldCompareFromTrueHigh() { Comparator c = BooleanComparator.TRUE_HIGH; - assertThat(c.compare(true, false)).isEqualTo(1); + assertThat(c.compare(true, false)).isGreaterThan(0); assertThat(c.compare(Boolean.TRUE, Boolean.TRUE)).isEqualTo(0); }