Usa le espressioni Lambda quando è possibile nelle buone pratiche di java?

52

Recentemente ho imparato l'espressione Lambda che è stata introdotta in java 8. Trovo che ogni volta che utilizzo un'interfaccia funzionale tendo a utilizzare sempre un'espressione Lambda invece di creare una classe che implementa l'interfaccia funzionale.

Questa è considerata una buona pratica? Oppure le loro situazioni in cui l'utilizzo di un Lambda per un'interfaccia funzionale non è appropriato?

    
posta SteelToe 27.01.2017 - 16:40
fonte

5 risposte

112

Esistono numerosi criteri che dovrebbero farti considerare di non utilizzare un lambda:

  • Dimensioni Più un lambda diventa grande, più difficile diventa seguire la logica che lo circonda.
  • Ripetizione È preferibile creare una funzione con nome per logica ripetuta, sebbene sia corretto ripetere lambdas molto semplici divisi.
  • Naming Se riesci a pensare a un grande nome semantico, dovresti usarlo, in quanto aggiunge molta chiarezza al tuo codice. Non sto parlando di nomi come priceIsOver100 . x -> x.price > 100 è chiaro come quel nome. Intendo nomi come isEligibleVoter che sostituiscono un lungo elenco di condizioni.
  • Nesting Lambdas annidati sono veramente, veramente difficili da leggere.

Non esagerare. Ricorda, il software è facilmente modificabile. In caso di dubbio, scrivilo in entrambe le direzioni e vedi quale è più facile da leggere.

    
risposta data 27.01.2017 - 17:42
fonte
14

Dipende. Ogni volta che ti trovi a utilizzare lo stesso lambda in luoghi diversi, dovresti prendere in considerazione l'implementazione di una classe che implementa l'interfaccia. Ma se tu avessi usato una classe interiore anonima altrimenti penso che un lambda sia di gran lunga migliore.

    
risposta data 27.01.2017 - 17:01
fonte
13

Appoggio la risposta di Karl Bielefeldt, ma voglio fornire una breve aggiunta.

  • Debugging Alcuni IDE combattono con scope all'interno di una lambda e lottano per visualizzare le variabili membro all'interno del contesto di una lambda. Mentre spero che questa situazione cambierà in futuro, può essere fastidioso mantenere il codice di qualcun altro quando è pieno di lambda.
risposta data 27.01.2017 - 20:39
fonte
5

Accesso alle variabili locali dello scope che racchiude

La risposta accettata da Karl Bielefeldt è corretta. Posso aggiungere un'altra distinzione:

  • Ambito

Il codice lambda inserito all'interno di un metodo all'interno di una classe può accedere a qualsiasi variabile efficace- finale trovata all'interno di quel metodo & classe.

La creazione di una classe che implementa l'interfaccia funzionale non fornisce tale accesso diretto allo stato del codice chiamante.

A citazione del tutorial Java (enfasi mia) :

Like local and anonymous classes, lambda expressions can capture variables; they have the same access to local variables of the enclosing scope. However, unlike local and anonymous classes, lambda expressions do not have any shadowing issues (see Shadowing for more information). Lambda expressions are lexically scoped. This means that they do not inherit any names from a supertype or introduce a new level of scoping. Declarations in a lambda expression are interpreted just as they are in the enclosing environment.

Quindi, mentre ci sono dei vantaggi nell'estrarre un lungo codice e nominarlo, è necessario confrontarlo con la semplicità dell'accesso diretto allo stato del metodo di inclusione & classe.

See:

risposta data 28.01.2017 - 22:33
fonte
4

Potrebbe trattarsi di nit-picking, ma a tutti gli altri punti eccellenti fatti in altre risposte, vorrei aggiungere:

Preferisci riferimenti al metodo quando possibile. Confronto:

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

vs

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

L'uso di un riferimento al metodo ti consente di dare un nome agli argomenti di lambda, che di solito sono ridondanti e / o portano a nomi pigri come e o x .

    
risposta data 08.02.2017 - 02:04
fonte

Leggi altre domande sui tag