Выражение, которое вы используете в конструкторе, является лямбда-выражением .Поскольку Comparator
- это функциональный интерфейс, то есть интерфейс только с одним абстрактным методом, лямбда-выражение может использоваться как сокращение для создания анонимного класса.
В вашем примере,
new PriorityQueue<String>((w1, w2) -> count.get(w1).equals(count.get(w2)) ? w2.compareTo(w1) : count.get(w1) - count.get(w2));
функционально эквивалентно
new PriorityQueue<String>(new Comparator<String>() {
public int compare(String w1, String w2) {
return count.get(w1).equals(count.get(w2)) ? w2.compareTo(w1) : count.get(w1) - count.get(w2);
}
});
Это также было бы то же самое, что создать отдельный класс, реализующий Comparator<String>
, и передать экземпляр этого класса в качестве параметра.на PriorityQueue
.
Что касается записи Comparator
в качестве оператора if, короткий ответ - нет.Компаратор должен быть экземпляром Comparator<String>
.Однако, возможно, более понятная версия того же компаратора выглядит следующим образом:
new PriorityQueue<String>((w1, w2) -> {
if (count.get(w1).equals(count.get(w2))) { // If the counts of w1 and w2 are the same,
return w2.compareTo(w1); // Then return the reverse lexicographical ordering of w1 and w2 (e.g. "Zebra" comes before "Apple")
} else if (count.get(w1) < count.get(w2)) {
return -1; // w1 comes before w2
} else {
return 1; // w1 comes after w2
}
});
Примечание: «Лексикографическое упорядочение» - это, в основном, алфавитное упорядочение, но основанное на кодах ASCII.Для получения дополнительной информации см. String#compareTo(String)
Надеюсь, это поможет!