2013-06-07 11 views
10

Il Java Tutorials per Lambda Expressions dice il seguente:Quali sono i vantaggi di Lambda Expressions per sistemi multicore?

questa sezione vengono illustrate funzionalità incluse in Project Lambda, che mira per supportare la programmazione in un ambiente multicore con l'aggiunta di chiusure e funzioni correlate al linguaggio Java.

La mia domanda è: quali vantaggi concreti ho con Lambda Expressions secondo i sistemi multicore e la programmazione simultanea/parallela?

+2

http://www.lambdafaq.org/why-are-lambda-expressions-being-added-to-java/ "* Il vantaggio che questo cambiamento comporta è che le raccolte possono ora organizzare internamente la propria iterazione, trasferendo la responsabilità per la parallelizzazione dal codice client al codice libreria. * " – assylias

risposta

8

Il parallelismo è banale da implementare per es. se si dispone di una raccolta e di implementare un lambda così:

collection.map { // my lambda } 

allora la collezione si può parallelizzare che il funzionamento senza dover fare la filettatura ecc te stesso. Il parallelismo viene gestito all'interno dell'implementazione della raccolta map().

in modo puramente funzionale (cioè senza effetti collaterali) del sistema, si può fare questo per ogni lambda. Per un ambiente non puramente funzionale dovresti selezionare i lambda per i quali ciò si applicherebbe (poiché il tuo lambda potrebbe non funzionare in sicurezza in parallelo). per esempio. in Scala devi esplicitamente prendere il parallel view on a collection per implementare quanto sopra.

+0

Solo per aggiungere alla risposta: questa capacità di parallelizzare non è specifica per lambdas ma per i funtori, vale a dire l'incapsulamento della logica di elaborazione in un oggetto. Con le precedenti versioni di Java potevi già farlo ma era ... goffo;) Quindi i lambdas sono solo un ottimo zucchero sintattico per scrivere i funtori, in particolare i funtori one shot. – Pragmateek

+0

@Serious: è un po 'fuorviante chiamare lo zucchero sintattico lambdas. Sono implementate in modo molto diverso rispetto alle classi interne anonime, che sarebbero state la precedente opzione "maldestra". Alla fine saranno molto più efficienti nel parallelizzare (alcuni) il codice per i sistemi multicore. –

+0

Interessanti, come vengono implementati in Java? Perché in C# i lambda sono compilati come classi e metodi, l'unico tipo di functor supportato da una piattaforma di basso livello. La parte di chiusura viene gestita tramite i campi. Come .Net e JRE sono piattaforme simili, anche se dovrebbe essere simile ... – Pragmateek

2

Nel pieno rispetto della funzione lambda Java e degli intenti o sviluppatori, vorrei chiedere: qual è il nuovo e perché è migliore rispetto all'approccio tradizionale di interfaccia/metodo? Perché è meglio di (supponiamo) forEach(IApply) dove:

IApply è un'interfaccia

public interface IApply { 
    void exec(KEY key, VALUE value); 
} 

Come impedisce al parallelismo? Almeno l'implementazione di IApply può essere riutilizzata, ereditata (estesa), implementata in classe statica.
L'ultimo argomento è importante dopo decine di esempi di errori di juniores che visto che manca quel codice lambda accede a questa di classe esterna può essere una causa di classe rimane nella memoria dopo chiaro riferimento ad essa è già nullo.
Da questo punto di vista riferimento a membri statici di una classe sono molto importanti (sono le analogie di un caso di C# "delegare" s. E principally- da una lambda a mano è super incapsulamento, da un altro non è riutilizzabile, e contemporaneamente - violazione dei principi di base della cultura OOD:..? utenti che accede master gratuito dal punto di vista della cultura della retromarcia programming- agli anni 70-esimo secolo scorso
programmazione funzionale -Vedo, ma perché per mix è il fenomeno OOP che Java è.L'OOD ha un modello meraviglioso chiamato disaccoppiamento Data-Behaviour che offre elegantemente le stesse possibilità? L'argomento - è lo stesso di Java Script ... nu, davvero! Quindi dagli strumenti per incorporare Java Script in Java e scrivere blocchi di sistema in Java Script. Quindi non vedo ancora così tanti benefici reali, come ci sono in onda di pubblicità.