Java method references are a shorthand notation of a lambda expression to call a method. They became available in Java 8, just like lambdas and streams. Method references allow for a cleaner and more readable way to refer to methods without executing them.
Static Method Reference
a reference to a static method is a type of method reference that allows you to reference and use a static method of a class as a functional interface. It is denoted by ClassName::staticMethodName. This type of method reference is useful when you want to pass a static method as an argument to a functional interface or use it in lambda expressions.
ClassName::staticMethodName
static void staticMethodReference() {
System.out.println("\nstaticMethodReference...");
// Using lambda expression
Arrays.asList("apple", "banana", "orange").forEach(str -> System.out.println(str.toUpperCase()));
// Using method reference
Arrays.asList("apple", "banana", "orange").forEach(Java8MethodReference::convertToUpperCase);
// using static method to print out
users.forEach(System.out::println);
System.out.println("staticMethodReference done!");
}
public static void convertToUpperCase(String str) {
System.out.println(str.toUpperCase());
}
Instance Method Reference
a reference to an instance method is a type of method reference that allows you to reference and use an instance method of a particular object as a functional interface. It is denoted by instance::instanceMethodName. This type of method reference is useful when you want to pass an instance method as an argument to a functional interface or use it in lambda expressions.
instance::instanceMethodName
static void instanceMethodReference() {
System.out.println("\ninstanceMethodReference...");
List<String> fruits = Arrays.asList("apple", "banana", "orange");
// Using lambda expression
fruits.forEach(str -> {
System.out.println("str: " + str + ",length: " + str.length());
});
Java8MethodReference java8MethodReference = new Java8MethodReference();
// Using method reference
fruits.forEach(java8MethodReference::printLength);
System.out.println("instanceMethodReference done!");
}
public void printLength(String str) {
System.out.println("str: " + str + ",length: " + str.length());
}
Constructor Method Reference
a reference to a constructor is a type of method reference that allows you to reference and use a constructor of a class as a functional interface. It is denoted by ClassName::new. This type of method reference is useful when you want to pass a constructor as an argument to a functional interface or use it in lambda expressions.
ClassName::new
static void constructorMethodReference() {
System.out.println("\nconstructorMethodReference...");
// Using lambda expression
Supplier<User> personLambda = () -> User.builder().firstName("John").lastName("Doe").build();
User johnFromLambda = personLambda.get();
System.out.println("User from lambda: " + johnFromLambda);
// Using method reference
Supplier<User> personMethodRef = User::new;
User johnFromMethodRef = personMethodRef.get();
System.out.println("User from method reference: " + johnFromMethodRef);
System.out.println("constructorMethodReference done!");
}