Тема 21. Указатели на методы - BelyiZ/JavaCourses GitHub Wiki
- Ссылки на методы
- Ссылка на статический метод
- Ссылка на нестатический метод конкретного объекта
- Ссылка на нестатический метод любого объекта конкретного типа
- Ссылка на конструктор
- Список литературы/курсов
Ссылки на методы (Method References) - это, по сути, сокращенные лямбда-выражения для методов у которых уже есть имя, используемые для вызова методов.
Отличие использования ссылок на методы от Лямбда-выражений: Лямбда-выражения используется для вызова метода, а ссылки на методы - вызывает (ссылается) на методы с использованием имени метода.
переписать более понятно почему что будет если объект изменится. как будет поведения
Они состоят из двух частей:
Class::method;
FootballTeam<String> footballTeam = Team -> System.out.println(Team);
можно переписать с помощью Method references
:
FootballTeam<String> footballTeam = System.out::println;
То есть если лямбда-выражение может быть передано в некоторый метод как параметр, то ссылка на метод также может быть передана в качестве параметра. С помощью этой ссылки можно обращаться к методу не вызывая его.
Преимущества использования: Ссылки на методы – это тип лямбда-выражений, которые используются для простой ссылки на метод в их вызове. С их помощью написание кода может быть намного более кратким и читабельным.
Ссылки на методы бывают четырех видов:
- Ссылка на статический метод
ContainingClass::staticMethodName
- Ссылка на нестатический метод конкретного объекта
containingObject::instanceMethodName
- Ссылка на нестатический метод любого объекта конкретного типа
ContainingType::methodName
- Ссылка на конструктор
ClassName::new
Синтаксис:
ContainingClass::staticMethodName
Пример:
PlayerInTeam<String, Boolean> playerInTeam = "Алексей Петров" -> Boolean.valueOf("Алексей Петров");
System.out.println( playerInTeam.apply("TRUE"));
Перепишем с помощью ссылки:
PlayerInTeam<String, Boolean> playerInTeam = Boolean::valueOf;
System.out.println(playerInTeam .apply("TRUE"));
Синтаксис:
containingObject::instanceMethodName
Этот тип используется когда лямбда выражение вызывает метод внешнего уже существующего объекта.
Пример:
Consumer<String> consumer = e -> System.out.println(e);
consumer.accept("OCPJP 8");
Перепишем, используя ссылку:
Consumer<String> consumer = System.out::println;
consumer.accept("OCPJP 8");
Пример:
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());
Синтаксис:
ContainingType::methodName
Пример:
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"));
Синтаксис:
ClassName::new
ClassName
не может быть абстрактным классом или интерфейсом.
Пример:
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"));