Тема 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::newClassName не может быть абстрактным классом или интерфейсом.
Пример:
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"));