Comparator::reverseOrder 和 Comparator.reverseOrder() 用于流的排序方法时有什么区别

What is the difference between Comparator::reverseOrder and Comparator.reverseOrder() when used in sorted method of stream

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<T>,对吧? Comparator<T> 是一个功能接口。它表示一个函数,该函数接受 2 个参数和 returns 一个 int 指示哪个参数更大或它们是否相等。

Comparator.reverseOrder()的情况下,reverseOrder是returns一个Comparator<T>的方法。在这种情况下,您调用该方法,它 returns 一个 Comparator 可以用作 sorted 的参数。一切都很好。

Comparator::reverseOrder 的情况下,您没有调用 reverseOrder。相反,您将 reverseOrder 作为函数传递给 sorted。如上所述,sorted 将接受一个带有 2 个参数和 returns 一个 int 的函数,但是您给它 reverseOrder,它不带任何参数并且 returns一个Comparator<T>。看到这里不匹配了吗?

Expected: a function that takes 2 parameters and returns an int OR a Comparator<T> object

What you gave it: a function that takes no parameters and returns a Comparator<T>

这会导致编译器错误。