Ревью 7. Ревью 7 - Функциональные Интерфейсы, Streams. Чем является Stream в контексте Java 3 Для чего нужен 3
Скачать 84.11 Kb.
|
Ссылка на методЧто такое Method References (ссылка на метод)?Если лямбда выражения вызывают только один существующий метод, лучше ссылать на этот метод по его имени. Ссылки на методы (Method References) – это компактные лямбда выражения для методов, у которых уже есть имя. Например: Consumer можно переписать с помощью method references: Consumer Результат будет в точности таким же, как в случае определения лямбда-выражения, которое вызывает этот метод. Разница между ссылкой на метод и лямбдой?Если заменить лямбду на ссылку на метод, то байткод класса будет компактнее, а значит, класс быстрее загрузится в JVM. Однако для того, чтобы ощутить такой прирост, нужны тысячи неоптимизированных лямбд. Тем не менее, в крупном проекте такое количество наберется легко. В остальном выбор между лямбдой и ссылкой на метод — вопрос вкуса и читаемости кода. Например, если в лямбде несколько строк, то читаемость снижается, и код только выиграет, если лямбду вынести в отдельный метод, и использовать ссылку на него. Ссылки на методы потенциально более эффективны, чем использование лямбда-выражений. Кроме того, они предоставляют компилятору более качественную информацию о типе и при возможности выбора между использованием ссылки на существующий метод и использованием лямбда-выражения, следует всегда предпочитать использование ссылки на метод. Какие виды ссылок на методы вы знаете?В Java различают 4 вида ссылок на методы: ссылки на статические методы; ссылки на методы экземпляра; ссылки на конструкторы; ссылки на обобщенные (шаблонные) методы. В каком виде передается Method References (ссылка на метод)?- имя_класса:: имя_стат_метода (для статического метода); - объект_класса:: имя_метода (для метода экземпляра); - название_класса:: new (для конструктора). Анонимные классыАнонимные классы, как создать, где применяются, особенно как создать экземпляр?Основная особенность - анонимный класс не имеет имени. Анонимный класс является подклассом существующего класса или реализации интерфейса, т.е. АК всегда от кого-то наследуется. Использование таких классов обычно обусловлено необходимостью однократного создания объекта класса, реализующего тот или иной абстрактный класс или интерфейс. Поскольку анонимный класс не имеет имени, он не может иметь явный конструктор. Также к анонимному классу невозможно обратиться извне объявляющего его выражения, за исключением неявного обращения посредством объектной ссылки на суперкласс или интерфейс. Анонимные классы никогда не могут быть статическими, либо абстрактными, и всегда являются конечными классами. Кроме того, каждое объявление анонимного класса уникально. Объявление такого класса выполняется одновременно с созданием его объекта посредством использования оператора new. Синтаксис: после оператора new вызывается конструктор класса (в случае обычного наследования) или указывается абстрактный класс или интерфейс, после которого следуют пустые круглые скобки (в случае реализации), затем в фигурных скобках описывается реализация. После фигурных скобок тела анонимного класса обязательно ставить точку с запятой. Можно ли заменить каждый анонимный класс выражением лямбда?Ответ - нет. Вы можете создать анонимный класс для не заключительных классов и интерфейсов. Не то же самое для лямбда-выражений. Они могут использоваться только там, где ожидается интерфейс SAM, т.е. интерфейсы только с одним абстрактным методом (до Java 8 каждый метод интерфейса был абстрактным, но поскольку интерфейсы Java 8 могут также иметь стандартные и статические методы, которые не являются абстрактными, поскольку они имеют реализацию). Итак, какие анонимные классы можно заменить выражением лямбда? Только анонимные классы, которые являются реализациями интерфейса SAM (например, Runnable, ActionListener, Comparator, Predicate), могут быть заменены выражением лямбда. DefaultConsumer не может быть лямбда-мишенью, потому что это даже не интерфейс. А как насчет потребителя? Несмотря на то, что Consumer является интерфейсом, он не является интерфейсом SAM, потому что он содержит более одного абстрактного метода, t и лямбда-мишень. |