Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why doesn't sorted(Comparator::reverseOrder) work?

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

like image 692
Vijay Narayanan Avatar asked Oct 20 '25 01:10

Vijay Narayanan


2 Answers

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.

like image 99
chrylis -cautiouslyoptimistic- Avatar answered Oct 21 '25 15:10

chrylis -cautiouslyoptimistic-


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.

like image 21
edwindh Avatar answered Oct 21 '25 14:10

edwindh



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!