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

Oro*_*Oro 4 java sorting comparator java-8 java-stream

在流的排序方法中使用Comparator::reverseOrder和之间的区别是什么Comparator.reverseOrder().

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

这有效:

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

但这不编译:

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

Swe*_*per 9

好问题!

sorted需要一个Comparator<T>,对吧?Comparator<T>是一个功能界面.它表示一个函数,它接受2个参数并返回一个int指示哪个参数更大或它们是否相等的函数.

在这种情况下Comparator.reverseOrder(),reverseOrder是一个返回a的方法Comparator<T>.在这种情况下,您调用该方法并返回一个Comparator可用作参数的方法sorted.一切都是好的.

在这种情况下Comparator::reverseOrder,你没有打电话reverseOrder.相反,你将reverseOrder作为一个函数传递给sorted.如上所述,sorted将接受一个带有2个参数并返回一个的函数int,但是你给它reverseOrder,它不带参数并返回一个Comparator<T>.看到这里不匹配?

预期:一个函数,它接受2个参数并返回一个int或一个Comparator<T>对象

你给它的东西:一个不带参数并返回a的函数 Comparator<T>

这会导致编译器错误.