【问题标题】:What is the difference between Comparator::reverseOrder and Comparator.reverseOrder() when used in sorted method of stream在流的排序方法中使用 Comparator::reverseOrder 和 Comparator.reverseOrder() 有什么区别
【发布时间】:2018-04-19 08:05:55
【问题描述】:

Comparator::reverseOrderComparator.reverseOrder() 在流的排序方法中使用时有什么区别。

    Stream<String> streamText = Stream.of("over the river", "through the woods", "to grandmother's house we go");

这行得通:

    streamText.filter(n -> n.startsWith("t"))
         .sorted(Comparator.reverseOrder())
         .findFirst().ifPresent(System.out::println);

但这不能编译:

    streamText.filter(n -> n.startsWith("t"))
         .sorted(Comparator::reverseOrder)
         .findFirst().ifPresent(System.out::println);

【问题讨论】:

  • sorted 接受 Comparator 作为其参数。 Comparator::reverseOrder 不是比较器。它是一种返回比较器的方法。所以你需要调用它并将返回值传递给sorted
  • 一个是方法调用,另一个是方法引用。它们不可互换。如果您能解释为什么您认为 sorted(Comparator::reverseOrder) 应该能够编译,这将有所帮助。

标签: java sorting java-8 java-stream comparator


【解决方案1】:

好问题!

sorted 需要Comparator&lt;T&gt;,对吗? Comparator&lt;T&gt; 是一个功能接口。它表示一个接受 2 个参数并返回 int 的函数,指示哪个参数更大或它们是否相等。

对于Comparator.reverseOrder()reverseOrder 是一个返回Comparator&lt;T&gt; 的方法。在这种情况下,您调用该方法,它会返回一个Comparator,它可以用作sorted 的参数。一切都很好。

对于Comparator::reverseOrder,您没有调用reverseOrder。相反,您将reverseOrder 作为函数传递给sorted。如上所述,sorted 将接受一个接受 2 个参数并返回 int 的函数,但您给它的是 reverseOrder,它不接受任何参数并返回 Comparator&lt;T&gt;。看到这里的不匹配了吗?

预期:一个接受 2 个参数并返回一个 int 或一个 Comparator&lt;T&gt; 对象的函数

你给它的东西:一个不带参数并返回Comparator&lt;T&gt;的函数

这会导致编译器错误。

【讨论】:

猜你喜欢
  • 2013-04-17
  • 2017-08-19
  • 1970-01-01
  • 2013-06-18
  • 2013-11-11
  • 2010-12-06
  • 2015-10-25
  • 2012-02-24
  • 1970-01-01
相关资源
最近更新 更多