Одним из главных преимуществ 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”