IntelliJ предлагает мне заменить лямбда-выражения ссылками на методы.
Есть ли между ними объективная разница?
java
intellij-idea
java-8
Gerard
источник
источник
Type[]::new
). Анонимный класс, созданный во время выполнения, будет таким же. JRE не делает между ними никакой разницы. Таким образом, использование ссылки на метод сэкономит вам один метод в вашем скомпилированном коде, с другой стороны, вы не сможете остановиться на них, выполняя пошаговую отладку…Ответы:
Позвольте мне предложить некоторые взгляды на то, почему мы добавили эту функцию в язык, когда явно в этом не было особой необходимости (все ссылки на методы могут быть выражены как лямбды).
Обратите внимание, что нет правильного ответа . Следует игнорировать любого, кто говорит «всегда использовать ссылку на метод вместо лямбда» или «всегда использовать лямбда вместо ссылки на метод».
Этот вопрос очень похож по духу на «когда мне следует использовать именованный класс, а не анонимный»? И ответ тот же: когда он станет более читаемым . Конечно, есть дела, которые определенно являются одним или определенно другим, но посередине много серого, и нужно использовать суждение.
Теория, лежащая в основе метода refs, проста: имена имеют значение . Если у метода есть имя, то обращение к нему по имени, а не с помощью обязательного пакета кода, который в конечном итоге просто поворачивается и вызывает его, часто (но не всегда!) Более четкое и читабельное.
Споры о производительности или о подсчете символов в основном отвлекают, и вам следует их игнорировать. Наша цель - написать код, в котором кристально ясно, что он делает. Очень часто (но не всегда!) Ссылки на методы выигрывают по этой метрике, поэтому мы включили их в качестве опции для использования в таких случаях.
Ключевое соображение относительно того, проясняют ли ссылки на методы или скрывают намерения, является то, очевидно ли из контекста, какова форма представляемой функции. В некоторых случаях (например,
map(Person::getLastName)
из контекста совершенно ясно, что требуется функция, которая сопоставляет одно с другим, и в подобных случаях светятся ссылки на методы. В других случаях использование метода ref требует, чтобы читатель задумался о том, какой вид of функции; это предупреждающий знак, что лямбда может быть более читаемой, даже если она длиннее.Наконец, мы обнаружили, что большинство людей сначала избегают ссылок на методы, потому что они кажутся еще более новыми и странными, чем лямбды, и поэтому сначала находят их «менее читаемыми», но со временем, когда они привыкнут к синтаксису, обычно меняют свое поведение и по возможности обращаются к ссылкам на методы. Так что имейте в виду, что ваша собственная субъективная первоначальная «менее читабельная» реакция почти наверняка влечет за собой некоторый аспект предвзятости в отношении фамильярности, и вы должны дать себе возможность освоиться с обоими, прежде чем высказывать стилистическое мнение.
источник
LiveData
, внутри aFragment
, который я преобразовал в,Event
который запускается с помощьюViewModel
... и другое поведение происходит, когда Android возвращается к тому жеFragment
... .поэтому мне трудно упростить его для вопросаДлинные лямбда-выражения, состоящие из нескольких операторов, могут снизить читабельность вашего кода. В таком случае извлечение этих операторов в методе и ссылка на него может быть лучшим выбором.
Другой причиной может быть повторное использование . Вместо того, чтобы копировать и вставлять лямбда-выражение из нескольких операторов, вы можете создать метод и вызывать его из разных мест вашего кода.
источник
houses.map(House::getName)
аhouses.map(h -> h.getName())
. Лямбда занимает на два символа меньше. Это правда, что тип не является явным, но любая среда IDE сообщит вам об этом, и, кроме того, лямбды следует использовать, когда тип очевиден. Я мог бы согласиться с вами в отношении возможности повторного использования, но лямбды очень маленькие, поэтому их можно связывать в цепочку вместо создания больших конкретных методов. В этом смысле небольшие методы более пригодны для многократного использования, чем некоторые большие и сложные методы, и из-за ясности лямбда-выражений (и в определенной степени многословия) их все еще легко читать.House
это очень хороший пример; как насчетThreeStoryRedBrickHouseWithBlueDoors
. Я предпочитаю ссылки на методы для лямбда-выражений с несколькими аргументами, а иногда и для того, чтобы подчеркнуть, что лямбда-выражения касается только одного вызова метода. В ссылке на метод меньше ошибок: вы можете неправильно написать аргумент на сайте использования, случайно ссылаясь на переменную из внешней области видимости и т. Д.