Java tutorial
package org.apache.commons.collections4.comparators; import java.io.Serializable; import java.util.Comparator; public class TransformingComparator<I, O> implements Comparator<I>, Serializable { private static final long serialVersionUID = 3456940356043606220L; private final Comparator<O> decorated; private final Transformer<? super I, ? extends O> transformer; public TransformingComparator(Transformer<? super I, ? extends O> transformer) { this(transformer, null); } public TransformingComparator(Transformer<? super I, ? extends O> transformer, Comparator<O> decorated) { this.decorated = decorated; this.transformer = transformer; } public int compare(I obj1, I obj2) { O value1 = this.transformer.transform(obj1); O value2 = this.transformer.transform(obj2); return this.decorated.compare(value1, value2); } public int hashCode() { byte total = 17; int total1 = total * 37 + (this.decorated == null ? 0 : this.decorated.hashCode()); total1 = total1 * 37 + (this.transformer == null ? 0 : this.transformer.hashCode()); return total1; } public boolean equals(Object object) { if (this == object) { return true; } else if (null == object) { return false; } else if (!object.getClass().equals(this.getClass())) { return false; } else { TransformingComparator comp = (TransformingComparator) object; return null == this.decorated ? null == comp.decorated : (this.decorated.equals(comp.decorated) && null == this.transformer ? null == comp.transformer : this.transformer.equals(comp.transformer)); } } }