Чтобы завершить очень хороший ответ Аомин, я расскажу о возможностях и поведении, стоящих за ними.
Обратите внимание, что вы должны отдавать предпочтение получателям (а также ссылкам на методы) по сравнению с прямым доступом к полю. Поэтому я проиллюстрирую это.
Я также буду полагаться на static import
для Comparator
статических методов, таких как import static java.util.Comparator.*;
, чтобы сосредоточиться на важных вещах.
То, что вы делаете, отменяет начальное обратное Comparator
на getHeight()
:
Comparator<Test> comparator =
comparingInt(Test::getHeight)
.reversed() // 1)
.thenComparingInt(Test::getWidth) // 2)
.reversed(); // 3)
С точки зрения логики это означает:
1) Сортировка путем сравнения на оборотной стороне Test::getHeight
.
2) Затем сортируйте, сравнивая по Test::getWidth
.
3) полностью изменить логику сравнения.
Таким образом, вы получаете компаратор, который сортирует по Test::getHeight
и
затем сортирует на обороте Test::getWidth
.
В решении, предоставленном Aomine:
Comparator<Test> comparator =
comparingInt(Test::getHeight) // 1)
.thenComparingInt(Test::getWidth) // 2)
.reversed(); // 3)
С точки зрения логики это означает:
1) Сортировка по сравнению с Test::getHeight
.
2) Затем сортируйте, сравнивая по Test::getWidth
.
3) полностью изменить логику сравнения.
Таким образом, вы получаете Comparator, который сортирует на оборотной стороне Test::getHeight
и
затем сортирует на обороте Test::getWidth
.
Вы также можете написать код таким образом (хотя и более многословно, но интересно с точки зрения обучения):
Comparator<Test> comparator =
comparingInt(Test::getHeight)
.reversed() // 1)
.thenComparing(comparingInt(Test::getWidth)
.reversed()); // 2)
С точки зрения логики это означает:
1) Сортировка путем сравнения на оборотной стороне Test::getHeight
.
2) Затем сортируйте, сравнивая на обратной стороне Test::getWidth
.
Это производит все еще Comparator, который сортирует на оборотной стороне Test::getHeight
и
затем сортирует на обороте Test::getWidth
.