Skip to content

Instantly share code, notes, and snippets.

@jamespan
Created March 9, 2015 15:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jamespan/f2d5b6dfd5fc71bef644 to your computer and use it in GitHub Desktop.
Save jamespan/f2d5b6dfd5fc71bef644 to your computer and use it in GitHub Desktop.
ComparisonChain
import java.util.Comparator;
public abstract class ComparisonChain {
boolean nullValueLess = false;
public ComparisonChain nullValueLess() {
nullValueLess = true;
return this;
}
public static ComparisonChain start() {
return ACTIVE;
}
private static final ComparisonChain ACTIVE = new ComparisonChain() {
@SuppressWarnings("unchecked")
@Override public ComparisonChain compare(Comparable left, Comparable right) {
if (nullValueLess) {
return left == null ?
(right == null ? ACTIVE : LESS)
:(right == null ? GREATER : classify(left.compareTo(right)));
} else {
return classify(left.compareTo(right));
}
}
@Override public <T> ComparisonChain compare(T left, T right, Comparator<T> comparator) {
if (nullValueLess) {
return left == null ?
(right == null ? ACTIVE : LESS)
:(right == null ? GREATER : classify(comparator.compare(left, right)));
} else {
return classify(comparator.compare(left, right));
}
}
@Override public ComparisonChain compare(Integer left, Integer right) {
return compare(left, (Comparable) right);
}
@Override public ComparisonChain compare(Long left, Long right) {
return compare(left, (Comparable) right);
}
@Override public ComparisonChain compare(Float left, Float right) {
return compare(left, (Comparable) right);
}
@Override public ComparisonChain compare(Double left, Double right) {
return compare(left, (Comparable) right);
}
@Override public ComparisonChain compareTrueFirst(Boolean left, Boolean right) {
return compare(right, left); // reversed
}
@Override public ComparisonChain compareFalseFirst(Boolean left, Boolean right) {
return compare(left, right);
}
ComparisonChain classify(int result) {
return (result < 0) ? LESS : (result > 0) ? GREATER : ACTIVE;
}
@Override public int result() {
return 0;
}
};
private static final ComparisonChain LESS = new InactiveComparisonChain(-1);
private static final ComparisonChain GREATER = new InactiveComparisonChain(1);
private static final class InactiveComparisonChain extends ComparisonChain {
final int result;
InactiveComparisonChain(int result) {
this.result = result;
}
@Override public ComparisonChain compare(Comparable left, Comparable right) {
return this;
}
@Override public <T> ComparisonChain compare(T left, T right, Comparator<T> comparator) {
return this;
}
@Override public ComparisonChain compare(Integer left, Integer right) {
return this;
}
@Override public ComparisonChain compare(Long left, Long right) {
return this;
}
@Override public ComparisonChain compare(Float left, Float right) {
return this;
}
@Override public ComparisonChain compare(Double left, Double right) {
return this;
}
@Override public ComparisonChain compareTrueFirst(Boolean left, Boolean right) {
return this;
}
@Override public ComparisonChain compareFalseFirst(Boolean left, Boolean right) {
return this;
}
@Override public int result() {
return result;
}
}
public abstract ComparisonChain compare(Comparable<?> left, Comparable<?> right);
public abstract <T> ComparisonChain compare(T left, T right, Comparator<T> comparator);
public abstract ComparisonChain compare(Integer left, Integer right);
public abstract ComparisonChain compare(Long left, Long right);
public abstract ComparisonChain compare(Float left, Float right);
public abstract ComparisonChain compare(Double left, Double right);
public abstract ComparisonChain compareTrueFirst(Boolean left, Boolean right);
public abstract ComparisonChain compareFalseFirst(Boolean left, Boolean right);
public abstract int result();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment