Why isn't (Comparator :: reverseOrder) sorting?

Below the Stream expression works great:

Stream<String> s = Stream.of("yellow","blue", "white");
 s.sorted(Comparator.reverseOrder())
  .forEach(System.out::print);` //yellowwhiteblue

      

Why isn't the equivalent method compiled with method references?

s.sorted(Comparator::reverseOrder).forEach(System.out::print);

      

Comparator type does not define reverseOrder (String, String) which is applicable here

+3


source to share


2 answers


The method reference tells Java to "treat this method as an implementation of the interface of a single method," that is, the method reference must be signed int foo(String,String)

and thus implemented Comparator<String>

.



Comparator.reverseOrder()

doesn't - Returns an instance Comparator

. Because it sorted

looks Comparator

, it can accept the result of a method call, but it cannot use that method as an interface implementation.

+4


source


The line of code with a method reference s.sorted (Comparator :: reverseOrder) tells Java that there is a static method with the signature of a trivial method comparator, which means there are two parameters.



The Comparator class only has a static reverseOrder method with no parameters, which causes a compilation error.

+1


source







All Articles