以下Stream表达式完美无缺:
Stream<String> s = Stream.of("yellow","blue", "white");
s.sorted(Comparator.reverseOrder())
.forEach(System.out::print);` //yellowwhiteblue
为什么带有方法引用的等效引用不能编译?
s.sorted(Comparator::reverseOrder).forEach(System.out::print);
Comparator类型没有定义reverseOrder(String,String) 适用于此
答案 0 :(得分:4)
方法引用告诉Java“将此方法视为单方法接口的实现” - 也就是说,方法引用应该具有签名int foo(String,String)
,从而实现Comparator<String>
。 / p>
Comparator.reverseOrder()
没有 - 它返回一个Comparator
实例。由于sorted
正在查找 for a Comparator
,因此它可以获取方法调用的结果,但它不能将该方法用作接口实现。
答案 1 :(得分:1)
带有方法引用 s.sorted(Comparator :: reverseOrder)的代码行告诉Java有一个带有普通方法比较器签名的静态方法,它意味着有两个参数。
类比较器只有静态方法 reverseOrder ,没有参数,这就是编译错误的原因。
答案 2 :(得分:0)
Stream<String> s=Stream.of("yellow","blue", "white");
s.sorted(String::compareTo)
.forEach(System.out::println);
如果您仍然想使用方法引用,则上面的方法将起作用。 这似乎是OCP Java 8认证中的常见问题。