Method reference is a shorthand notation of a lambda expression to call a method. str -> System.out.println(str) can be replaced with System.out::println
Let’s think we going to call following method using a lambda implementation. As you might know Consumer is function interface provided by java where we can send a our implementation as a parameter.
private static void show(List<Integer> ls, Consumer consumer){
for(Integer I: ls){
consumer.accept(I);
}
}
We can execute it like this using a lambda implementation, here we sending print method to consumer so that consumer will print when we execute accept method.
List<Integer> ls = Arrays.asList(6,7,8);
show(ls, o -> System.out.println(o));
Now let’s try do the same using a method reference feature,
List<Integer> ls = Arrays.asList(2,3,5);
show(ls, System.out::println);
In this code we have used method reference instead of lambda expression.
Another Example
List names = new ArrayList();
names.add("Nuwan");
names.add("Sen");
names.forEach(System.out::println);
Another Example 2
Comparator<String> sc = (first, second) -> first.compareToIgnoreCase(second);
can be replaced with
Comparator<String> stringIgnoreCase = String::compareToIgnoreCase;
Like this
Comparator<String> sc2=String::compareToIgnoreCase;
List<String> values = Arrays.asList("Sen", "Nuwan","Kandy");
Collections.sort(values, sc2);
System.out.println(values);
Another Example 3
Function<String, Job> jobCreator2 = (jobName) -> return new Job(jobName);
can be replaced with
Function<String, Job> jobCreator = Job::new;
Example 4 Constructor Reference
Let’s say we want to create a object of this class
class Job{
String s;
Job(String s){
this.s=s;
}
}
We can do it like this
Function<String, Job> jobCreator = Job::new;
Job job= jobCreator.apply("dsds");
System.out.println( job.s);
First line of code not neccerally create the object, it actually happens at apply().
These examples works with methods passed with single arguments. For example if you are looping a list of objects and wants to print a single field then you may have to override toString method of the object.
Read my other blogs: