Java lambda 表达式、转换和比较器
我正在查看该接口的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());
}
从方法声明中,我了解到这是一个泛型方法,它返回一个比较器,该比较器的类型要么是从传递给它的映射条目推断出来的,要么是在方法中显式提供的。
真正让我失望的是回报值。看来 lambda 表达式
(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 表达式转换为 ?他们还能被塑造成什么样子?或者 lambda 表达式本质上只是一个 ?有人能澄清这一切吗?
Comparator
Comparator