2011-01-23 15 views
10

Recentemente sono passato da C# a Java [nuovamente]. Ma mi mancano le espressioni lambda e cose come IEnumerable.Foreach di C#. Quindi sto cercando una libreria di espressioni lambda in Java.Espressioni lambda di .NET in Java

ci sono librerie migliori di LambdaJ?

Inoltre è clojure direttamente inlinable nei programmi Java? Posso mescolare il codice clojure nelle funzioni Java?

+0

Interessante ... C# non viene fornito con 'IEnumerable.Foreach' – Gabe

+2

@Gabe - hai ragione riguardo al punto di vista. Intendevo i metodi di gestione della raccolta che agiscono. Lista .Foreach/Array.Foreach o Ienumerable . Tutti ecc. – Fakrudeen

risposta

13

Java 8 potrebbe avere il supporto lambda in modo nativo. Fino ad allora puoi utilizzare una combinazione di classi interne anonime e librerie come google-guava. Qui di seguito sono altre librerie che si può guardare in

O meglio guardare Scala

+0

Non capisco niente, l'espressione Lambda è brevettata da Microsoft. Qual è la possibilità che Java possa usarlo? – hardywang

+1

Ho riso quando l'ho letto, quindi ho trovato: http://www.google.com/patents/US20070044083 ... C# non è vicino alla prima lingua per avere espressioni lambda. Il brevetto deve essere uno di quelli stupidi "Non voglio essere denunciato per aver fatto questa cosa che tutti hanno usato" brevetti. – Dale

3

Il ciclo foreach equivalente in Java è strutturato in questo modo

List<Foo> fooList = // some list containing foos 
for (Foo foo : fooList){ 
    // do stuff 
} 

ci sono espressioni lambda in Java, ma se si può aspettare fino a quando Java8 sono l'aggiunta di chiusure. Il più vicino possibile è anonymous inner classes.

+0

Grazie - ma non intendevo l'equivalente della parola chiave foreach di C#. Intendevo SomeCollection.ForEach (chiusura). La parte successiva della risposta è comunque utile, sebbene a. le classi interne sono prolisse. – Fakrudeen

3

La libreria di Google Guava contieneClassie Predicate che possono essere utilizzate per emulare funzionalità simili a lambda. Come menzionato in precedenza da kgrad, puoi creare istanze anonime di ognuna.

http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/base/Function.html
http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/base/Predicate.html

Anche se si potrebbe facilmente scrivere classi come questi da soli, Guava contiene un sacco di metodi di supporto che utilizzano funzioni e predicati per fare le cose come trasformare o filtrando tutti i diversi tipi di iterables: http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Iterables.html

Nota: mi rendo conto che Pangea ha già pubblicato un link a Google Guava sopra, ma avevo già iniziato a scrivere questo post e ho pensato che sarebbe stato comunque utile fornire i collegamenti.

Problemi correlati