2015-04-17 2 views
8

Я прочитал в книге (Fischer's Java Closures and Lambda, Apress 2015), что ссылки на методы предпочтительнее лямбда-выражений. С моей точки зрения, выражение лямбда легче понять разработчикам, которые используют другие языки. Тогда почему он говорит, что ссылка на метод предпочтительнее? Является ли сочинение лямбда-выражения плохой практикой в ​​Java 8?Лямбда-выражение или ссылка на метод?

+1

Это не «плохая практика», это просто означает, что он не может многократно использоваться и не может самоопределяться (рекурсия). – alfasin

+0

Downvoter - прокомментируйте! – alfasin

+0

Какая книга? Автор Роберт Фишер? –

ответ

15

В разделе Lambda Best Practices главы 2, книга Фишера говорит:

Насколько возможно, используйте ссылку на метод вместо лямбда. Ссылки на методы не только более короткие и удобные для чтения, но использование ссылок на методы поможет вам непосредственно думать о методах как значениях. Это код, который нужен акцизы от вашего кодовую и ваш мозг:

x -> it.do(x) 

Если вы естественно писать этот код, то вы до сих пор не сделали прыжок, чтобы думать на более высоком уровне функциональных программирование. Как только вы совершите этот скачок, станет намного проще общаться и работать со сложными функциями, потому что вы будете думать о типах, а не о значениях.

Хотя я в основном согласен с заключением, я не уверен, что я куплю линию рассуждений Фишера. Ссылки на методы часто, хотя и не всегда, короче, чем выписанная лямбда. В первой части он говорит, что ссылки на методы помогут вам подумать о методах как значениях. Хорошо, но потом он говорит, что все станет проще, потому что вы будете думать о типах, а не о значениях. Я не уверен, что это значит.

Это можно переписать пример выражение он дает, как

it::do 

Это, конечно, меньше, чем оригинал, но это трудно обобщать из крошечного примера.

Вот мой подход к методам против списанных лямбда.

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

Если вы знакомы с лямбда-выражениями с других языков, то лямбда-выражения в Java, вероятно, будут более знакомы, чем ссылки на методы. Тем не менее, я считаю, что это временное состояние, пока вы не изучите ссылки на методы. Как только они станут более знакомы, преимущества ссылок на методы могут перевесить первоначальную незнакомость.

Рассмотрим этот простой пример получения длины строк:

List<String> list = ... ; 
int[] lengths1 = list.stream().mapToInt(s -> s.length()).toArray(); 
int[] lengths2 = list.stream().mapToInt(String::length).toArray(); 

В этом случае размер лямбда-выражения является лишь примерно такой же, как размер стандартного метода (в количестве символов). Но обратите внимание, что ссылка на метод содержит больше информации о типе. Он сообщает читателю, что тип элемента - String, что может помочь в понимании длинного конвейера. Иногда это также полезно для компилятора, если он не может вывести тип элемента, что иногда встречается в сложных выражениях.

Еще один момент заключается в том, что использование ссылки на метод часто освобождает вас от ответственности за появление имени для формального параметра, который просто передается другому методу. Именование часто важно, но форматы лямбда часто являются «мусорными» именами, такими как ix или s, как в этом примере.

Ссылка на метод немного более эффективна, так как не требуется генерировать статический метод, который должен быть вызван, чтобы перейти к методу String.length(). Но эта эффективность редко является важным соображением.

Рассмотрим также этот пример, намеренно лишен контекста:

(x, y) -> x + y 

Является ли это конкатенация или числовое сложение? Если числовое, какой тип? По правилам языка это должно быть известно во время компиляции, иначе это ошибка. Хотя это может быть понятно компилятору, иногда это не очень понятно читателю. Рассмотрим вместо этих ссылок метод:

String::concat 
Integer::sum 
Double::sum 

Используя имя для работы в этом случае делает его очень четко читателю о том, что имеется в виду.

Смежные вопросы