Шаг 1
Одним из способов упростить и сопоставить это может быть то, что ваш код:
public int compare(Obj a, Obj b){
if(a.age > b.age) return 1;
if(a.age < b.age) return -1;
else return 0;
}
будет представлен следующим образом (учитывая age
это int
переменная)
public int compare(Obj a, Obj b) {
return Integer.compare(a.getAge(), b.getAge());
}
, где Integer.compare
внутренне выполняет ту же логику, что вы делали ранее:
return (x < y) ? -1 : ((x == y) ? 0 : 1)
Шаг 2
Теперь это может привести кбыть представленным с использованием компаратора в виде:
Comparator<Obj> ageComparator = Comparator.comparingInt(Obj::getAge);
, который Comparator.comparingInt
внутренне выполняет
return (Comparator<T> & Serializable)
(c1, c2) -> Integer.compare(keyExtractor.applyAsInt(c1), keyExtractor.applyAsInt(c2));
Следовательно, порядок, в конечном итоге индуцированный всеми этими тремя формами, будет одинаковымнапример, когда вы вызываете
objList.sort(ageComparator);
Comparable
, метод compareTo
может более подробно рассказать о сравнении
Compares this object with the specified object for order. Returns a
negative integer, zero, or a positive integer as this object is less
than, equal to, or greater than the specified object.
и, следовательно, это считается естественным порядком из Obj
, когда вы переопределяете compareTo
, расширяющийся до Comparable<Obj>
.