Я просматривал исходный код Java для интерфейса Map
и сталкивался с этим небольшим фрагментом кода:
/**
* Returns a comparator that compares {@link Map.Entry} in natural order on value.
*
* <p>The returned comparator is serializable and throws {@link
* NullPointerException} when comparing an entry with null values.
*
* @param <K> the type of the map keys
* @param <V> the {@link Comparable} type of the map values
* @return a comparator that compares {@link Map.Entry} in natural order on value.
* @see Comparable
* @since 1.8
*/
public static <K, V extends Comparable<? super V>> Comparator<Map.Entry<K,V>> comparingByValue() {
return (Comparator<Map.Entry<K, V>> & Serializable)
(c1, c2) -> c1.getValue().compareTo(c2.getValue());
}
Из объявления метода я получаю, что это общий метод, который возвращает Компаратор типа, который либо выводится из записей карты, переданных ему, либо явно предоставленных в методе.
То, что действительно меня выбрасывает, - это возвращаемая стоимость. По-видимому, выражение лямбда
(c1, c2) -> c1.getValue().compareTo(c2.getValue());
явно Comparator<Map.Entry<K, V>>
. Это правильно?
Я также заметил, что явное включение включает & Serializable
. Я никогда не видел интерфейс в сочетании с классом в листинге раньше, но он выглядит следующим образом в компиляторе:
((SubClass & AnInterface) anObject).interfaceMethod();
Хотя следующее не работает:
public class Foo {
public static void main(String[] args) {
Object o = new Foo() {
public void bar() {
System.out.println("nope");
}
};
((Foo & Bar) o).bar();
}
}
interface Bar {
public void bar();
}
Итак, два вопроса:
-
Как добавить интерфейс к роли, который должен работать? Означает ли это только принудительный тип возвращаемого метода интерфейса?
-
Можете ли вы применить выражение Lambda к
Comparator
? Что еще их можно отличить? Или это лямбда-выражение, по существу, простоComparator
? Может ли кто-нибудь прояснить все это?