A method reference lets you use an existing method as the implementation of a functional interface. It can make a lambda expression shorter when the lambda only calls that method.
In this example, you will use a method reference to print each language in a list.
Source code
Save the following code as MethodReferenceExample.java:
import java.util.List;
public class MethodReferenceExample {
void main() {
List<String> languages = List.of(
"Java", "Python", "JavaScript");
languages.forEach(IO::println);
}
}
Explanation
The example creates a list containing three language names:
List<String> languages = List.of(
"Java", "Python", "JavaScript");
The forEach() method performs an action for each element in the list:
languages.forEach(IO::println);
It accepts a Consumer, a functional interface whose abstract method takes one argument and returns no value.
Referring to an existing method
The expression IO::println is a reference to the static println() method in java.lang.IO.
The double colon (::) separates the class name from the method name. The method reference does not call the method immediately. It supplies the action that forEach() invokes for each element.
This method reference can replace the following lambda expression:
languages.forEach(language -> IO.println(language));
Both versions print each language on a separate line, in list order.
Matching the functional interface
For this list, forEach() needs an action that accepts a string and returns no value.
IO.println(Object) is compatible because it accepts a String as an Object and returns void.
You do not add parentheses after the method name in a method reference:
IO::println
Parentheses belong to a method call, such as:
IO.println("Java");
Run the example
Compile and run the file:
javac MethodReferenceExample.java
java MethodReferenceExample
Output
Java
Python
JavaScript
Use a method reference when an existing method already performs the required action. Keep a lambda expression when you need additional logic, such as adding a prefix before printing each value.
