Урок 15

Ссылки на методы


1. Что такое ссылка на методы

Если лямбда выражения вызывают только один существующий метод, лучше ссылать на этот метод по его имени.

Ссылка на методы (Method References) – это компактные лямбда выражения для методов у которых уже есть имя. Например:

Consumer<String> consumer = str -> System.out.println(str);

Можно переписать с помощью method references:

Consumer<String> consumer = System.out::println;

Существует четыре типа ссылок на методы:

Тип Пример

Ссылка на статический метод

ContainingClass::staticMethodName

Ссылка на нестатический метод конкретного объекта

containingObject::instanceMethodName
Ссылка на нестатический метод любого объекта конкретного типа  ContainingType::methodName
Ссылка на конструктор  ClassName::new

2. Ссылка на статический метод

Синтаксис:

ContainingClass::staticMethodName

Пример 1. 

Function<String, Boolean> function = e -> Boolean.valueOf(e);
System.out.println(function.apply("TRUE")); 

Перепишем с помощью ссылки:

Function<String, Boolean> function = Boolean::valueOf; 
System.out.println(function.apply("TRUE"));

3. Ссылка на нестатический метод конкретного объекта

Синтаксис:

containingObject::instanceMethodName

Этот тип используется когда лямбда выражение вызывает метод внешнего уже существующего объекта.

Пример 2. 

Consumer<String> consumer = e -> System.out.println(e); 
consumer.accept("OCPJP 8");

Перепишем, используя ссылку:

Consumer<String> consumer = System.out::println; 
consumer.accept("OCPJP 8");

Пример 3.

Integer integer = 5;
Supplier<String> supplier = () -> integer.toString();
System.out.println(supplier.get());

Перепишем:

Integer integer = 5; 
Supplier<String> supplier = integer::toString; 
System.out.println(supplier.get());

4. Ссылка на нестатический метод любого объекта конкретного типа

Синтаксис:

ContainingType::methodName

Пример 4.

Function<String, String> function = s -> s.toLowerCase(); 
System.out.println(function.apply("OCPJP 8"));

Перепишем:

Function<String, String> function = String::toLowerCase; 
System.out.println(function.apply("OCPJP 8"));

5. Ссылка на конструктор

Синтаксис:

ClassName::new

ClassName не может быть абстрактным классом или интерфейсом.

Пример 5.

Function<String, Integer> function = (d) -> new Integer(d); 
System.out.println(function.apply("4"));

Перепишем:

Function<String, Integer> function = Integer::new; 
System.out.println(function.apply("4"));


0 comments
Leave your comment: