public static void main(String o[]) {
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("a", 1);
map.entrySet().stream().sorted(Comparator.comparing(Entry::getValue)).forEach(System.out::println);
}
Above code builds and runs perfectly but it shouldn't. Comparator.comparing takes a function reference and only those methods which takes one argument and returns one argument can be mapped on this. But in above code getValue is mapped and works fine but it doesn't take any parameter. Code should give build issue but doesn't. Is there any issue with my concept?
The single argument
comparing
method:takes a
Function<? super T, ? extends U>
argument, which is a functional interface that contains a single method that takes a argument of one type and returns a value of some other type.Entry::getValue
takes an argument of one type (Map.Entry<String, Integer>
in your example) and returns a value of some other type (Integer
in your example). Therefore it matches theFunction
functional interface.Yes it does - each
Map.Entry
element taken from theStream
serves as an argument of theapply()
method of theFunction
interface.Perhaps this will clarify:
The
getValue()
method ofMap.Entry
can be viewed as aFunction
that accepts aMap.Entry
instance and return the value of that instance (returned by callinggetValue()
on that instance).