【问题标题】:Why doesn't sorted(Comparator::reverseOrder) work?为什么 sorted(Comparator::reverseOrder) 不起作用?
【发布时间】:2017-08-19 13:58:44
【问题描述】:

下面的 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) 在这里适用

【问题讨论】:

  • 为什么你认为Comparator.reverseOrder()Comparator::reverseOrder 是等价的?你认为,这些是同一事物的不同语法吗?那是有意义的吗?

标签: java java-8 java-stream comparator


【解决方案1】:

方法引用告诉Java“将此方法视为单方法接口的实现”——也就是说,方法引用应该具有签名int foo(String,String),从而实现Comparator&lt;String&gt;

Comparator.reverseOrder() 没有——它返回Comparator 实例。由于sorted 正在寻找寻找 Comparator,它可以获取方法调用的结果,但不能将该方法用作接口实现。

【讨论】:

    【解决方案2】:

    方法引用s.sorted(Comparator::reverseOrder)的代码行告诉Java有一个带有普通方法比较器签名的静态方法,这意味着有两个参数。

    Comparator类只有静态方法reverseOrder没有参数,这就是编译错误的原因。

    【讨论】:

      【解决方案3】:
      Stream<String> s=Stream.of("yellow","blue", "white");
              s.sorted(String::compareTo)
                      .forEach(System.out::println);
      

      如果您仍想使用方法引用,那么上述方法将起作用。 这似乎是 OCP Java 8 认证中的常见问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-15
        • 2014-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多