Skip to content

Commit

Permalink
Closes #890: Implements Null Safe Comparators by Function
Browse files Browse the repository at this point in the history
Signed-off-by: vmzakharov <zakharov.vladimir.m@gmail.com>
  • Loading branch information
vmzakharov committed May 20, 2020
1 parent e71d6db commit 3876f2c
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -360,6 +360,20 @@ public static <T, V extends Comparable<? super V>> SerializableComparator<T> byF
return Comparators.byFunction(function, naturalOrder());
}

public static <T, V extends Comparable<? super V>> SerializableComparator<T> byFunctionNullsLast(Function<? super T, ? extends V> function)
{
return Comparators.byFunction(
function,
Comparator.nullsLast(Comparator.naturalOrder()));
}

public static <T, V extends Comparable<? super V>> SerializableComparator<T> byFunctionNullsFirst(Function<? super T, ? extends V> function)
{
return Comparators.byFunction(
function,
Comparator.nullsFirst(Comparator.naturalOrder()));
}

public static <T> SerializableComparator<T> byBooleanFunction(BooleanFunction<T> function)
{
return Functions.toBooleanComparator(function);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -201,4 +201,34 @@ public void compareBySecond()
+ "TGphdmEvdXRpbC9Db21wYXJhdG9yO3hwcA==",
Comparators.bySecondOfPair(null));
}

@Test
public void compareByFunctionNullsLast()
{
Verify.assertSerializedForm(
1L,
"rO0ABXNyAEBvcmcuZWNsaXBzZS5jb2xsZWN0aW9ucy5pbXBsLmJsb2NrLmNvbXBhcmF0b3IuRnVu\n"
+ "Y3Rpb25Db21wYXJhdG9yAAAAAAAAAAECAAJMAApjb21wYXJhdG9ydAAWTGphdmEvdXRpbC9Db21w\n"
+ "YXJhdG9yO0wACGZ1bmN0aW9udAA1TG9yZy9lY2xpcHNlL2NvbGxlY3Rpb25zL2FwaS9ibG9jay9m\n"
+ "dW5jdGlvbi9GdW5jdGlvbjt4cHNyACRqYXZhLnV0aWwuQ29tcGFyYXRvcnMkTnVsbENvbXBhcmF0\n"
+ "b3KW851NtwreSAIAAloACW51bGxGaXJzdEwABHJlYWxxAH4AAXhwAH5yACxqYXZhLnV0aWwuQ29t\n"
+ "cGFyYXRvcnMkTmF0dXJhbE9yZGVyQ29tcGFyYXRvcgAAAAAAAAAAEgAAeHIADmphdmEubGFuZy5F\n"
+ "bnVtAAAAAAAAAAASAAB4cHQACElOU1RBTkNFcA==",
Comparators.byFunctionNullsLast(null));
}

@Test
public void compareByFunctionNullsFirst()
{
Verify.assertSerializedForm(
1L,
"rO0ABXNyAEBvcmcuZWNsaXBzZS5jb2xsZWN0aW9ucy5pbXBsLmJsb2NrLmNvbXBhcmF0b3IuRnVu\n"
+ "Y3Rpb25Db21wYXJhdG9yAAAAAAAAAAECAAJMAApjb21wYXJhdG9ydAAWTGphdmEvdXRpbC9Db21w\n"
+ "YXJhdG9yO0wACGZ1bmN0aW9udAA1TG9yZy9lY2xpcHNlL2NvbGxlY3Rpb25zL2FwaS9ibG9jay9m\n"
+ "dW5jdGlvbi9GdW5jdGlvbjt4cHNyACRqYXZhLnV0aWwuQ29tcGFyYXRvcnMkTnVsbENvbXBhcmF0\n"
+ "b3KW851NtwreSAIAAloACW51bGxGaXJzdEwABHJlYWxxAH4AAXhwAX5yACxqYXZhLnV0aWwuQ29t\n"
+ "cGFyYXRvcnMkTmF0dXJhbE9yZGVyQ29tcGFyYXRvcgAAAAAAAAAAEgAAeHIADmphdmEubGFuZy5F\n"
+ "bnVtAAAAAAAAAAASAAB4cHQACElOU1RBTkNFcA==",
Comparators.byFunctionNullsFirst(null));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import org.eclipse.collections.api.block.function.primitive.IntFunction;
import org.eclipse.collections.api.block.function.primitive.LongFunction;
import org.eclipse.collections.api.block.function.primitive.ShortFunction;
import org.eclipse.collections.api.factory.Lists;
import org.eclipse.collections.api.list.MutableList;
import org.eclipse.collections.api.tuple.Pair;
import org.eclipse.collections.impl.list.Interval;
Expand Down Expand Up @@ -196,6 +197,44 @@ public void fromFunctions()
Verify.assertZero(personComparator.compare(raab, raab));
}

@Test
public void fromFunctionsSafeNullsHigh()
{
Person bob = new Person("Bob", null, 0);
Person dan = new Person("Dan", "Witwicky", 0);
Person alice = new Person("Alice", "Liddell", 0);
Person carol = new Person("Carol", null, 0);

Comparator<Person> personComparator = Comparators.byFunctionNullsLast(Person::getLastName);
Verify.assertNegative(personComparator.compare(alice, bob));
Verify.assertPositive(personComparator.compare(carol, alice));
Verify.assertNegative(personComparator.compare(alice, dan));
Verify.assertZero(personComparator.compare(bob, carol));

MutableList<Person> people = Lists.mutable.of(bob, dan, carol, alice);
people.sortThis(personComparator);
Assert.assertEquals(Lists.immutable.of(alice, dan, bob, carol), people);
}

@Test
public void fromFunctionsSafeNullsLow()
{
Person bob = new Person("Bob", null, 0);
Person dan = new Person("Dan", "Witwicky", 0);
Person alice = new Person("Alice", "Liddell", 0);
Person carol = new Person("Carol", null, 0);

Comparator<Person> personComparator = Comparators.byFunctionNullsFirst(Person::getLastName);
Verify.assertPositive(personComparator.compare(alice, bob));
Verify.assertNegative(personComparator.compare(carol, alice));
Verify.assertNegative(personComparator.compare(alice, dan));
Verify.assertZero(personComparator.compare(bob, carol));

MutableList<Person> people = Lists.mutable.of(bob, dan, carol, alice);
people.sortThis(personComparator);
Assert.assertEquals(Lists.immutable.of(bob, carol, alice, dan), people);
}

@Test
public void fromFunctionsWithTwoArgs()
{
Expand Down

0 comments on commit 3876f2c

Please sign in to comment.