The below Stream expression works perfectly fine:
Stream<String> s = Stream.of("yellow","blue", "white");
s.sorted(Comparator.reverseOrder())
.forEach(System.out::print);` //yellowwhiteblue
Why doesn't the equivalent one with method references compile?
s.sorted(Comparator::reverseOrder).forEach(System.out::print);
The type Comparator does not define reverseOrder(String, String) that is applicable here
A method reference is telling Java "treat this method as the implementation of a single-method interface"--that is, the method reference should have the signature int foo(String,String)
and thus implement Comparator<String>
.
Comparator.reverseOrder()
doesn't--it returns a Comparator
instance. Since sorted
is looking for a Comparator
, it can take the result of the method call, but it can't use that method as the interface implementation.
The line of code with method reference s.sorted(Comparator::reverseOrder) is telling Java that there is a static method with the signature of a trivial method comparator, it means with two parameters.
The class Comparator has only the static method reverseOrder without parameters, that's the reason of the compiling error.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With