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
comparingmethod: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::getValuetakes an argument of one type (Map.Entry<String, Integer>in your example) and returns a value of some other type (Integerin your example). Therefore it matches theFunctionfunctional interface.Yes it does - each
Map.Entryelement taken from theStreamserves as an argument of theapply()method of theFunctioninterface.Perhaps this will clarify:
The
getValue()method ofMap.Entrycan be viewed as aFunctionthat accepts aMap.Entryinstance and return the value of that instance (returned by callinggetValue()on that instance).