Рубрики
Без рубрики

Эффективная Java! Предпочитаю ссылки на методы Лямбдам

Погружение в главу 43 “Эффективная Java”. Помеченный как java, эффективный, лямбда, архитектура.

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

Ссылки на методы – это на самом деле просто ссылка на метод, который позволяет нам пропустить шаблон простой передачи параметров из одного места в другое. Давайте рассмотрим чрезвычайно простой пример:

IntStream.of(1,2,3).reduce((a, b) -> Integer.sum(a, b));

Это довольно простой код, который просто создает IntStream , суммирует все значения вместе и возвращает сумму. Мы используем лямбда-выражение как часть вызова reduce . Это не очень подробно, но (a, b) -> не дает нам никакой ценности. Смотрю на этот же код, но со ссылками на методы.

IntStream.of(1,2,3).reduce(Integer::sum);

Это действительно проще, и мне нравится, что он фокусируется на том, что делается, а не на том, как это сделать. Не показывая, как достигается сумма, прямо заявляя, что это сумма, которая происходит.

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

Наконец, способ вызова ссылки на метод немного меняется в зависимости от того, что это за код.

Целое число::parseInt Статический str -> Целое число.parseInt(str)
Instant.now()::находится после Связанный Instant.now(); t -> then.isAfter(t);
Строка::В нижнем регистре Несвязанный str -> str.в нижнем регистре()
Древовидная карта::новая Конструктор класса () -> новая древовидная карта
int[]::новый Конструктор массива len -> новый ввод[len]

В основном это сводится к этому эмпирическому правилу: когда ссылки на методы короче и понятнее (что часто бывает), используйте их.

Оригинал: “https://dev.to/kylec32/effective-java-prefer-method-references-to-lambdas-j5b”