2011-01-23 6 views
10

Niedawno przeniosłem się z języka C# na język Java [ponownie]. Ale bardzo brakuje mi wyrażeń lambda i rzeczy takich jak IEnumerable.Foreach of C#. Poszukuję biblioteki wyrażeń lambda w Javie.Wyrażenia lambdy .NET w Javie

czy istnieją lepsze biblioteki niż LambdaJ?

Również jest clojure bezpośrednio inlinable w programach Java? Czy mogę mieszać kod clojure w funkcjach Java?

+0

Interesujące ... C# nie wysyła nawet z 'IEnumerable.Foreach' – Gabe

+2

@Gabe - masz rację co do punktu pedantycznego. Miałem na myśli metody obsługi kolekcji, które podejmują działania. List .Foreach/Array.Foreach lub ROCZNE . Wszystko itp. – Fakrudeen

Odpowiedz

13

Java 8 może mieć wsparcie lambda natywnie. Do tego czasu możesz używać kombinacji anonimowych klas wewnętrznych i bibliotek, takich jak google-guava. Poniżej znajdują się inne biblioteki, które można zajrzeć do

Albo lepiej przyjrzeć Scala

+0

Nie otrzymuję jednej rzeczy, wyrażenie Lambda jest opatentowane przez Microsoft. Jaka jest szansa, że ​​Java może z niego korzystać? – hardywang

+1

Zaśmiałem się, gdy to przeczytałem - a potem znalazłem: http://www.google.com/patents/US20070044083 ... C# nie jest zbliżony do pierwszego języka, w którym występują wyrażenia lambda. Patent musi być jednym z tych głupich "Nie chcę być pozwany za to, że wszyscy używali" patentów. – Dale

3

Równowartość pętli foreach w Javie jest skonstruowany jak to

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

Brak wyrażenia lambda w Java, jednak jeśli możesz poczekać aż Java8 dodają zamknięć. Najbliższe można uzyskać: anonymous inner classes.

+0

Dzięki - ale nie miałem na myśli odpowiednika słowa kluczowego foreach C#. Miałem na myśli SomeCollection.ForEach (zamknięcie). Późniejsza część odpowiedzi jest przydatna, chociaż. wewnętrzne klasy są pełne. – Fakrudeen

3

Biblioteka Google Guava zawiera Function i Predicate klasy, które mogą być używane do emulacji funkcjonalności podobnej do lambda. Jak wspomniałeś powyżej, możesz tworzyć anonimowe instancje każdego z nich.

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

Chociaż można łatwo napisać klas podoba ci się, guawa zawiera wiele metod pomocniczych, które wykorzystują funkcje i predykatów do robienia rzeczy, jak przekształcenie lub filtrowanie wszystkie różne rodzaje iterables: http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Iterables.html

Uwaga: Zdaję sobie sprawę, że Pangea opublikował już link do Google Guava powyżej, ale już zacząłem pisać ten post i uważałem, że przydatne będzie podanie linków.