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)
好问题!
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>
这会导致编译器错误.