为什么不排序(Comparator :: reverseOrder)有效?

时间:2017-03-27 01:33:59

标签: java java-8 java-stream comparator

以下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)   适用于此

3 个答案:

答案 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认证中的常见问题。