¿Está utilizando expresiones Lambda siempre que sea posible en las buenas prácticas de Java?

52

Recientemente he dominado la expresión Lambda que se introdujo en Java 8. Me parece que siempre que estoy usando una interfaz funcional, tiendo a usar siempre una expresión Lambda en lugar de crear una clase que implementa la interfaz funcional.

¿Se considera esto una buena práctica? ¿O son sus situaciones donde el uso de un Lambda para una interfaz funcional no es apropiado?

    
pregunta SteelToe 27.01.2017 - 16:40

5 respuestas

112

Hay una serie de criterios que deberían hacer que consideres no usar un lambda:

  • Tamaño Cuanto más grande es un lambda, más difícil es seguir la lógica que lo rodea.
  • Repetición Es mejor crear una función con nombre para lógica repetida, aunque está bien repetir lambdas muy simples que están separadas.
  • Nombrar Si puedes pensar en un gran nombre semántico, debes usarlo en su lugar, ya que agrega mucha claridad a tu código. No estoy hablando de nombres como priceIsOver100 . x -> x.price > 100 es tan claro como ese nombre. Me refiero a nombres como isEligibleVoter que reemplazan una larga lista de condiciones.
  • Anidar Las lambdas anidadas son realmente, realmente difíciles de leer.

No exageres. Recuerde, el software se cambia fácilmente. Cuando tenga dudas, escríbalo en ambos sentidos y vea cuál es más fácil de leer.

    
respondido por el Karl Bielefeldt 27.01.2017 - 17:42
14

Depende. Cuando te encuentres usando el mismo lambda en diferentes lugares, deberías considerar implementar una clase que implemente la interfaz. Pero si hubieras usado una clase interna anónima de lo contrario, creo que un lambda es mucho mejor.

    
respondido por el Tonni Tielens 27.01.2017 - 17:01
13

Apoyo la respuesta de Karl Bielefeldt, pero quiero proporcionar una breve adición.

  • Depuración Algunos IDE luchan con el alcance dentro de un lambda y luchan por mostrar las variables de los miembros dentro del contexto de un lambda. Si bien es de esperar que esta situación cambie en la línea, puede ser molesto mantener el código de otra persona cuando está lleno de lambdas.
respondido por el Jolleyboy 27.01.2017 - 20:39
5

Acceso a variables locales del ámbito de aplicación

La respuesta aceptada por Karl Bielefeldt es correcta. Puedo añadir una distinción más:

  • Ámbito

El código lambda anidado dentro de un método dentro de una clase puede acceder a cualquier variable final encontrada dentro de ese método & clase.

La creación de una clase que implementa la interfaz funcional no le brinda tal acceso directo al estado del código de llamada.

Para citar el Tutorial de Java (énfasis mío) :

  

Al igual que las clases locales y anónimas, las expresiones lambda pueden capturar variables; tienen el mismo acceso a las variables locales del ámbito adjunto . Sin embargo, a diferencia de las clases locales y anónimas, las expresiones lambda no tienen ningún problema de sombreado (consulte Sombreado para obtener más información). Las expresiones Lambda tienen un alcance léxico. Esto significa que no heredan ningún nombre de un supertipo ni introducen un nuevo nivel de alcance. Las declaraciones en una expresión lambda se interpretan tal como están en el entorno envolvente.

Entonces, si bien hay beneficios al extraer un código largo y nombrarlo, debe compararlo con la simplicidad del acceso directo al estado del método de cierre y amp; clase.

Ver:

respondido por el Basil Bourque 28.01.2017 - 22:33
4

Esto podría ser una búsqueda de liendres, pero a todos los otros puntos excelentes en otras respuestas, les agregaría:

Prefiere las referencias a métodos cuando sea posible. Comparar:

employees.stream()
         .map(Employee::getName)
         .forEach(System.out::println);

versus

employees.stream()
         .map(employee -> employee.getName())
         .forEach(employeeName -> System.out.println(employeeName));

Usar una referencia de método le ahorra la necesidad de nombrar los argumentos de lambda, que generalmente son redundantes y / o llevan a nombres perezosos como e o x .

    
respondido por el Matt McHenry 08.02.2017 - 02:04

Lea otras preguntas en las etiquetas