Created
March 9, 2015 15:52
-
-
Save jamespan/f2d5b6dfd5fc71bef644 to your computer and use it in GitHub Desktop.
ComparisonChain
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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